Dart語言開啓研究之路。

dart語言一直不慍不火,默默成長,可是隨着谷歌的慢慢發力,這種語言前景愈來愈光明,它屬於全棧式的語言,既能前端,也能後端。前端

我今天無聊開始研究下這門語言,dart算是什麼語言呢?它能夠編譯成爲JS,所以能夠成爲WEB開發的選擇,同時在本地它也能夠擁有虛擬機,也能開發服務器之類的程序。python

在目前多如毛的語言中,任何一門語言出來面世,都要和其餘語言作比較,看看它有什麼優點,有什麼樣的用途。後端

先看看運行效率。數組

目前執行效率第一的是C/C++(對於咱們這種從事互聯網的人來講,相信極少人去用匯編),其次RUST,再次是GO,OBJECT-C等,這是你們公認的,緊隨其後的是JAVA、C#、或者delphi之類的等等。緩存

拿JAVA作比較最好,由於JAVA語言在目前的互聯網中,用途極爲普遍:網站服務器,遊戲服務器、也能作科學數據分析,更能作出高性能的數據隊列緩存,以上這麼多成功的例子中,說明它的運行速度極爲不平凡。服務器

至於安卓爲何那麼卡,那是由於與蘋果的對比把安卓給踢下去了,形成很差的印象,仔細想一想,當年蘋果手機6000元以上,而安卓手機那時候不過千元左右,甚至不少人購買幾百元的安卓手機,價格相差這麼大,安卓想不卡都不行,安卓一卡,結果JAVA背上了黑鍋。函數

1:整數計算對比性能

JAVA代碼:網站

long sum=0;
		long t = (System.currentTimeMillis());
		for (int i = 0; i <20000; i++) {
			for (int n = 0; n < 20000;n++) {
				sum=(sum+i*n);
			 }
			}
	
		System.out.println(sum);
		System.out.println((float) (System.currentTimeMillis() - t) );
	}

執行結果:編碼

39996000100000000
1466.0 (備註:毫秒)

Dart語言代碼以下:

import 'dart:math';
void main(){
  DateTime now = new DateTime.now();
  var sum=0;

for (var i = 0; i < 20000; i++) {
    for (var n = 0; n < 20000; n++) {
      sum=sum+i*n;
  }
}


DateTime now1 = new DateTime.now();

print(sum);
print(now1.difference(now).inMicroseconds/1000);
print(now);
print(now1);
}

執行結果

39996000100000000

982.608(備註:毫秒)

2018-03-07 02:04:18.102754

2018-03-07 02:04:19.085362

對照下來,整數型的計算中,dart的速度是快過JAVA,而浮點型的運算JAVA快不少了。

JAVA中把代碼修改成:  sum=Math.sqrt(sum+i*n); Dart中把代碼修改成:sum= sqrt( sum+i*n);

JAVA執行的速度爲6755.0毫秒(6.8秒),而Dart的速度爲9342.055 毫秒(9.3秒),能夠看到JAVA的速度快了三分之一。

這足以說明Dart勝任服務器語言開發了,由於連python這麼慢的語言,作爲遊戲服務器和網站服務器開發的比例愈來愈高了,而PYTHON執行上面的浮點數的代碼,須要5分鐘。

1:dart數據變量。

dart中定義變量,可用var,也可指定類型,爲了開發方便,直接用var,假如服務器開發中,儘可能指定類型。

(爲了程序能達到高性能,儘可能指定類型,這樣能夠減小編譯器的負擔和運行時間,好比上面的代碼中,var sum=0,和double sum=0.0,它們執行的時間是不一樣的,指定了類型的運行時間爲9.3秒,而用var關鍵詞,時間達到了11.3秒。)

在dart中,任何東西全是對象,好比函數、變量等、全部的對象繼承了Object類。

在dart中能夠用final,它的值不可以被更改,應該在初始化的時候指定。

好比下面代碼:

final j=10;
j=10;
print(j);

編譯直接報錯,breaking at exception: NoSuchMethodError。即便J的值沒有改變,也會報錯,由於賦值操做使得對象改變了。

在dart中能夠用const,它的值也不可以被更改。

它們二者的區別是:其中定義final的變量初始化就定義了,而const類型的爲編譯時常量,所以也沒法改變其值。const和final能夠作運算的,好比下面的代碼:

const aa=10;
const bb=20;
const cc=aa*bb;
print(cc);

final a=10;
final b=20;
final c=a*b;
print(c);

結果爲:200,200

2:Dart的內置類型。

1:整型。

整形範圍:-9223372036854775808---9223372036854775807之間,包含這兩個數字。在64位系統上,也就是-2**63~2**63-1之間。

好比定義的時候,也能夠用十六進制:

int x = 110000;
int hex = 0xFFFF;

print(hex);

2:double類型

 定義要注意:

double a =10;//錯誤的定義
double B=3+5;//錯誤的定義
double c=3*5;//錯誤的定義

這樣的話定義是錯誤,會提示:A value of type 'int' can't be assigned to a variable of type 'double

必需要這樣定義纔是正確的:

double a =10.0;
double b =1+2.5;
double c=3/6;

double和int相加的時候,要注意下面問題:

double a =1.2;
int d=10;
a=a+d;
print(a);
輸出11.2


double a =1.2;
int d=10;
d=a+d;
print(a);
編譯器報錯

double能夠等於double+int的,在一些其餘的語言中,類型必須嚴格控制的,好比GO語言中,這種寫法是錯誤的,必須double=double+double或者float64=float64+float64。

3:字符串類型;

dart中的字符串用的是utf-16的編碼格式,有點異類。

dart字符串定義,能夠用單引號,也能夠雙引號。

var s1 = 'hello ';
var s2 = "world.";


print(s1);
print(s2);
print(s1+s2);

輸出結果:
hello 
world.
hello world.

char字符或者unicode編碼字符的轉換,有點不一樣其餘的語言,看下面代碼:

var s1 = 'hello ';
var s2 = "world.";
String a='A';

print(s1);
print(s2);
print(s1+s2);
print(a.codeUnitAt(0));
print((s1+s2).codeUnits);

-----------------
輸出結果:
hello 
world.
hello world.
65
[104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 46]

一些其餘語言直接用'A', 或者charCodeAt()等等這些來取得。

轉義字符的運用:

var s1 = 'hel\lo ';
print(s1);


var s2 = r'hel\lo ';
print(s2);

------------------
輸出結果:
hello 
hel\lo

能夠看到這種處理有點相似PYTHON的方式,前面直接加r。

字符串的一些操做:

var s1 = 'hello';
print( s1.substring(0,2));
print( s1.split(''));
print(s1.toUpperCase());
print( s1[0]);

------------
輸出結果
he
[h, e, l, l, o]
HELLO
h

爲了性能的考慮,好比拼接字符串用StringBuffer:

var sb = new StringBuffer();
sb.write('hello');
sb.writeAll(['W', 'o', 'r','d'], '');
sb.writeAll(['!','!'], ' ');
print(sb.toString());

----------------
輸出結果
helloWord! !

是否是有點像JAVA中的StringBuffer。

3:布爾類型

Dart中布爾類型只有true或者false,沒有0或者1之類的表示。

bool a;
print(a);
if (a){
  print(0);
}else{
    print(1);
}
----
輸出結果:
先輸出null後,而後報錯

這是爲何呢?由於Dart中,沒有初始化的全爲NULL,而不是爲false.

下面這段代碼:

var A = 'hahah';
if (A) {
 print('A');
}

var a = 1;
if (a) {
 print('A');
}

這兩段代碼全會報錯,這又是爲何呢?由於dart中,A和a爲對象,沒法做爲判斷條件,和JS、python等語言有巨大差異。

Lists類型

有點相似python中的list,定義的時候,直接var a=[1,2]。

list添加:

var list = [8,1,2,3]; 
list.add(4);       
print(list);

------
[8, 1, 2, 3, 4]

list刪除元素

var list = [8,1,2,3]; 
list.add(4);       
print(list);

list.remove(2)
print(list);

list.remove(2);
print(list);


-----
[8, 1, 2, 3, 4]
[8, 1, 3, 4]
[8, 1, 3, 4]

能夠看到即便元素2已結被刪除了,它再次刪除的時候,也不會報錯。

list.removeAt(index), list.remove是刪除指定的元素,removeAt(i)是刪除索引爲i的元素.
而這個list.removeRange(0, 2);刪除索引的範圍是0到2的元素(不包括索引爲2).
list.removeLast()是刪除最後一個元素。
而list.removeWhere(bool);須要寫個函數判斷來刪除哪些元素,好比:

bool del(int i){
   if (i>5){
     return true;
   }
   return false;
}
removeWhere會直接刪除大於5的元素。

 

list的join操做

var list = [1,2,3,4]; //實例化一個list
var s= list.join('!~');
print(list);
print(s);

---------
[1, 2, 3, 4]
1!~2!~3!~4

能夠看到list.join後,必須賦給新的變量纔有效。

list的排序

list.sort();

list打亂順序

list.shuffle();

list的截取

var list = [1,1,2,5,8,89,100]; //實例化一個list
var a=list.sublist(0,5);
print(a);
-----
[1, 1, 2, 5, 8]

list的填充

var list = [1,1,2,5,8,89,100]; //實例化一個list
list.fillRange(0, 5,20);
print(list);

------
[20, 20, 20, 20, 20, 89, 100]

list的清除

var list = [1,1,2,5,8,89,100]; //實例化一個list
list.clear();
print(list);
-----------
[]

兩個list數組的添加

var list = [1,1,2,5,8,89,100]; //實例化一個list
list.addAll([1,2]);
print(list);

------------
[1, 1, 2, 5, 8, 89, 100, 1, 2]

list的遍歷

var list = [1,1,2,5]; //實例化一個list

for (final x in list) {
  print(x);
}
for (var i = 0; i < list.length; i++) {
  print(list[i]);
}
list.forEach((i) => print(i));


三種方式

 

最後一種MAP類型,單獨開來寫。

相關文章
相關標籤/搜索