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類型,單獨開來寫。