博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Dart语言开启研究之路。
阅读量:7089 次
发布时间:2019-06-28

本文共 5443 字,大约阅读时间需要 18 分钟。

hot3.png

dart语言一直不愠不火,默默成长,但是随着谷歌的慢慢发力,这种语言前景越来越光明,它属于全栈式的语言,既能前端,也能后端。

我今天无聊开始研究下这门语言,dart算是什么语言呢?它可以编译成为JS,因此可以成为WEB开发的选择,同时在本地它也可以拥有虚拟机,也能开发服务器之类的程序。

在目前多如毛的语言中,任何一门语言出来面世,都要和其他语言做比较,看看它有什么优势,有什么样的用途。

先看看运行效率。

目前执行效率第一的是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.2double 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]HELLOh

为了性能的考虑,比如拼接字符串用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]; //实例化一个listvar 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]; //实例化一个listvar a=list.sublist(0,5);print(a);-----[1, 1, 2, 5, 8]

list的填充

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

list的清除

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

两个list数组的添加

var list = [1,1,2,5,8,89,100]; //实例化一个listlist.addAll([1,2]);print(list);------------[1, 1, 2, 5, 8, 89, 100, 1, 2]

list的遍历

var list = [1,1,2,5]; //实例化一个listfor (final x in list) {  print(x);}for (var i = 0; i < list.length; i++) {  print(list[i]);}list.forEach((i) => print(i));三种方式

 

最后一种MAP类型,单独开来写。

转载于:https://my.oschina.net/u/248241/blog/1630734

你可能感兴趣的文章
[C#进阶系列]专题二:你知道Dictionary查找速度为什么快吗?
查看>>
并发连接数、请求数、并发用户数
查看>>
SDA报告给各国网络空间安全防卫水平进行评级
查看>>
去小机化思维(二)--【软件和信息服务】2015.03
查看>>
【翻译】Sencha Cmd中脚本压缩方法之比较
查看>>
最新.NET 5.0 C#6 MVC6 WCF5 NoSQL Azure开发120课视频
查看>>
爱因斯坦计划最新进展(201710)
查看>>
传统HA系统的终结者-【软件和信息服务】2013.11
查看>>
Spread for Windows Forms快速入门(15)---使用 Spread 设计器
查看>>
自动抓屏工具 -- psr
查看>>
高端手机市场,拼配置还是拼安全
查看>>
评蔡文胜区块链10问,数字货币不等于区块链,套路韭菜不要太明显
查看>>
数据丢失零容忍
查看>>
php分词
查看>>
经典图书评注:Accustoming Yourself to C++
查看>>
转载:RamDisk~充分利用你的大内存,详细教程(11月7 新功能更新)
查看>>
用C#代码实现类似QQ窗体的“上、左、右”停靠功能
查看>>
jqPlot
查看>>
将Access换成sql要改些什么?注意哪些问题?(汇总)
查看>>
SQL中的union和union all区别(转)
查看>>