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类型,单独开来写。