Dart特點(diǎn):
1、基于JIT的快速開發(fā)周期:
flutter在開發(fā)階段采用了JIT模式,避免了每次改動(dòng)都要進(jìn)行編譯,節(jié)省開發(fā)時(shí)間(運(yùn)行的時(shí)候再去編譯成機(jī)器碼)
2、基于AOT的發(fā)布包:
flutter在發(fā)布時(shí)可以通過(guò)AOT生成高效的ARM代碼以保證應(yīng)用性能铝耻。
(提前將我們的代碼編譯成機(jī)器碼)
3、單線程
不需要鎖,不存在數(shù)據(jù)競(jìng)爭(zhēng)和變量狀態(tài)同步瓢捉,也沒有線程上下文切換的性能順灝和鎖導(dǎo)致的卡頓
4频丘、垃圾回收
多生代(新生代:復(fù)制-清除算法、老生代:標(biāo)記-清除算法泡态。第一次創(chuàng)建的時(shí)候就是新生代搂漠,每隔一段時(shí)間檢查一遍變量,有用的就保留某弦,沒用的清除桐汤,這些存活下來(lái)的就會(huì)標(biāo)記一下,到了一定數(shù)量就會(huì)進(jìn)入老生代靶壮,老生代的對(duì)象很少被清理)無(wú)鎖垃圾回收器怔毛,專門為UI框架中常見的大量widgets對(duì)象創(chuàng)建和銷毀優(yōu)化
1、變量
1.1 var與dynamic
void main() {
// 方法可以不寫在類中腾降,獨(dú)立存在
int a = 0; // 聲明變量拣度,可以直接用int,與java類型
var b = "哈哈";
// b = 10; // 報(bào)錯(cuò)螃壤,聲明變量賦值的那一刻抗果,就決定了它的類型。b是string類型
var c; // 沒有給變量c賦值奸晴,那c的值就是null冤馏,類型是object。下面就可以任意賦值
c = "嘿嘿";
c = 10;
// dynamic關(guān)鍵字寄啼,意思是動(dòng)態(tài)的逮光。不是在編譯的時(shí)候來(lái)確定變量的實(shí)際類型,而是在運(yùn)行的時(shí)候動(dòng)態(tài)的確定類型
// 效率沒有靜態(tài)的高辕录。
// 在不確定類型時(shí)傳入睦霎,不經(jīng)常使用
dynamic d = "呵呵";
d = 20;
// 以下三個(gè)的區(qū)別。是編譯和運(yùn)行的時(shí)候走诞,底層實(shí)現(xiàn)上存在區(qū)別
Object i = 1; // 在編譯的時(shí)候是object,任意類型蛤高。它的類型由它的值確定
var j = 1; // 在編譯期確定了j的類型是int
dynamic z = 1; // 在運(yùn)行時(shí)才確定z的類型蚣旱,它的類型也是由它的值確定
}
2.2 final與const
void main2() {
final i = 1; // final是運(yùn)行時(shí)常量
// i = 2; // 報(bào)錯(cuò),final修飾的變量不能再賦值戴陡。和java中用法一樣
const j = 1; // const是編譯器常量塞绿,在編譯期就已經(jīng)確定了值,運(yùn)行效率比f(wàn)inal高
// j =2; // 報(bào)錯(cuò)恤批,const修飾的變量也不能再賦值异吻。
// const z = i; // 報(bào)錯(cuò),i是運(yùn)行時(shí)才確定值,不能賦值給編譯期就需要確定的變量
const z = j; // 這個(gè)是可以的诀浪,都是編譯器就能確定的值
const z2 = j + 1;
final k = z2; // 這個(gè)也可以的棋返。可以將編譯時(shí)就確定的值賦值給運(yùn)行時(shí)才確定的變量
}
2雷猪、七大內(nèi)置類型
數(shù)值類型(num)睛竣、字符串類型(String)、布爾類型(bool)求摇、數(shù)組類型(List)射沟、映射類型(Map)、Unicode(Runes)与境、標(biāo)識(shí)符(Symbols)
2.1 數(shù)值類型(num)
void main() {
// java中的int占4個(gè)字節(jié)验夯,dart中的int 是動(dòng)態(tài)確定字節(jié)大小的
// 在編碼的時(shí)候,可以將int當(dāng)成java的short摔刁、int挥转、long來(lái)使用,
// 如果我們寫的dart代碼超過(guò)了4個(gè)字節(jié)簸搞,那么dart會(huì)將其編譯成類似java中的long類型
// 否則編譯成java中的short或者int
int i = 1; // 占1個(gè)字符
int i1 = 2; // 占2個(gè)字符
int i2 = 3; // 占2個(gè)字符
int i3 = 10; // 占4個(gè)字符
}
2.2 字符串類型(String)
void main() {
String str = "haha"; //聲明和java中的string一樣
String str2 = "${str}hehe"; // 字符串的拼接和kotlin中的類似
String str3 = 'heihei'; // dart中既可以使用單引號(hào)扁位,也可以使用雙引號(hào),沒有區(qū)別
// 其好處是趁俊,可以混合使用域仇。比如說(shuō)在java中如果想要打印帶有雙引號(hào)的字符串,就需要使用轉(zhuǎn)義
String str4 = "\"test\""; // java中寫法寺擂。dart也可以這樣寫暇务,但還有下面兩種寫法。
String str5 = "'test'"; // dart中就可以混合寫怔软,寫法2
String str6 = '"test2"'; // dart中寫法3
// 如果我們想在dart中打印帶轉(zhuǎn)義字符的字符串垦细,比如打印 /n ,也需要使用轉(zhuǎn)義
String str7 = "\\n";
// 也可以使用r前綴,r的意思就是raw,原始挡逼。舍棄字符串中所有的字表符括改、換行符、空格符等
String str8 = r"\n";
// 三個(gè)雙引號(hào)用來(lái)聲明多行字符串家坎。與kotlin中類似
String str9 = """
aaaa
bbbbbb
cccccccc
""";
}
2.3 布爾類型(bool)
void main() {
bool b = false;
}
2.4 數(shù)組類型(List)
void main() {
// List<String> list = new List(); // 可以省略new
List<int> list1 = [1, 2, 3, 4]; // 可以直接用中括號(hào)進(jìn)行賦值嘱能,初始列表
// 像java數(shù)組一樣通過(guò)下標(biāo)取元素,和kotlin類似
var item = list1[0];
// 遍歷數(shù)組方式1,(模板快捷鍵iter)
for (var o in list1) {}
// 遍歷數(shù)組方式2,(模板快捷鍵itar)
for (var i = 0; i < list1.length; ++i) {
var o = list1[i];
}
// 在初始列表前添加關(guān)鍵字const
// const前面學(xué)過(guò)虱疏,表示編譯期就已經(jīng)確定了的值惹骂,不可修改。這里表明這個(gè)集合對(duì)象是不可變的做瞪,不能再add元素了
List<int> list2 = const [1, 2, 3, 4];
// list2.add(5); // 運(yùn)行時(shí)報(bào)錯(cuò)
list2 = [1, 2]; // 不報(bào)錯(cuò)
// 如果const修飾的是變量对粪,也就是引用,那么變量就不能再重新引用其他對(duì)象了,也不能添加元素
const List<int> list3 = [1, 2, 3, 4];
// list3 = [1,2]; // 編譯報(bào)錯(cuò)
// list3.add(5); // 運(yùn)行時(shí)報(bào)錯(cuò)
}
2.5 映射類型(Map)
void main() {
// key和value用 : 分隔
Map<int, int> map = {1: 2, 2: 3, 3: 4};
var value = map[1]; // 中括號(hào)里的是key著拭,得到的值是value
map[1] = 1; // 修改value
// 用const聲明和list是一樣的纱扭。const修飾對(duì)象,不可添加/修改元素
var map1 = const {1: 2, 2: 3, 3: 4};
// map1[3] = 100;// 添加元素茫死,運(yùn)行報(bào)錯(cuò)
// const Map<int, int> map2 = {1: 2, 2: 3, 3: 4};
// map2[3] = 100;// 添加元素跪但,運(yùn)行報(bào)錯(cuò)
const Map<int, int> map2 = {1: 2, 2: 3, 3: 4};
// map2[3] = 100;// 添加元素,運(yùn)行報(bào)錯(cuò)
// map2 = {1: 2, 2: 3};// 運(yùn)行報(bào)錯(cuò)
// 遍歷:迭代器的遍歷
var keys = map2.keys;
for (var value1 in keys) {}
}
2.6 Unicode(Runes)/ 標(biāo)識(shí)符(Symbols)
Unicode Runes:特殊字符表示類(Unicode32峦萎,字符的編碼標(biāo)準(zhǔn))屡久。不常用
// Symbols 標(biāo)識(shí)符。不常用
void main() {
var a = #afda;
print(a.runtimeType);// 打印的結(jié)果就是Symbol
// 可以用于switch語(yǔ)句
}
3爱榔、操作符
3.1 類型轉(zhuǎn)換:as
void main() {
var j = 1;
var i = j as int; // 類型轉(zhuǎn)換被环,類似kotlin,java中的強(qiáng)轉(zhuǎn)
print('i=$i');
3.2 類型判斷 :is 详幽、 is!
void main() {
Object i1 = 1;
var isInt = i1 is int; // 類型判斷筛欢,類似kotlin,java中的instantof
var isBool = i1 is! bool; // 判斷對(duì)象不是某個(gè)類型
3.3 賦值操作符:??=
void main() {
var a;
if (a == null) {
a = "賦值了";
}
a ??= "我的值為null"; //安全賦值唇聘。如果k的值為null版姑,則輸出等號(hào)后面的值。相當(dāng)于kotlin中的?=
}
3.4 條件表達(dá)式:
void main() {
// 三目表達(dá)式 ? :
var c = true ? "t" : "f"; // 與java用法一樣
// ??
var d;
var d1 = 1;
var e = d ?? 2; // e = 2
var e1 = d1 ?? 2; // e1 = 1
}
3.5 級(jí)聯(lián)操作符:..
void main() {
// 使用兩個(gè)..來(lái)實(shí)現(xiàn)鏈?zhǔn)秸{(diào)用
Builder()
..aa()
..bbbb() // bbbb()的返回值會(huì)被忽略
..ccccccc();
}
class Builder {
void aa() {}
bool bbbb() {
return true;
}
void ccccccc() {}
}
3.6 安全操作符:?.
void main() {
// 類似kotlin中的
var str = null;
print(str?.length); // 如果str為null迟郎,不執(zhí)行str.length()
}