第3章 Dart基础语法 -- 数据类型

Dart中除了使用var,Object和dynamic声明变量,数据本身是由类型的,Dart中也可以直接使用数据类型进行更准确的类型声明。
Dart中数据类型

类型 说明
num 数字,包含int(整数)和double(浮点数)
String 字符串
bool 布尔,逻辑true或false
List 数组/list集合
Set set集合
Map map集合
Runes 符号,Unicode字符
Symbole 标示

1. num类型

num类型是数字类型的父类,它包含了两个子类

  • int
  • double
    num类型还包含了常规四则运算的各种操作符的定义。
num a = 32;
num b = 3.14;
num c = a + b;
print(c); //35.14
1.1 int类型

int类型表示的是整数类型。根据平台的不同,整数值不大于64位。

  • 在Dart VM上,值可以从-263到263 - 1
  • 编译成JavaScript的Dart使用JavaScript代码,允许值从-253到253- 1。
int a = 32;
int b = 3;
int c = a + b;
print(c); // 35
int a = 0xA; //十六进制
int b = 3;
int c = a + b;
print(c); // 13

int类型的API

API属性 返回值类型 说明
bitLength int 变量占用bit位数
hashcode int hash码
isEven bool 是否为偶数
isOdd bool 是否为奇数
isFinite bool 是否为有限数字(非无穷大)
isInfinite bool 是否为无限数字(无穷大)
isNegative bool 是否为负数
isNaN bool 是否为非数
runtimeType Type 当前对象的运行类型
sign int 当前对象的符号。取值为-1,0,1
API方法 返回值类型 说明
abs() int 当前变量绝对值
clamp(int n1, int n2); num 获得[n1,n2]区间距离当前变量最近的数字(n1 <= n2)
compareTo(int n) int 当前变量与n比较,根据比较结果返回-1,0,1
gcd(int n) int 当前变量与n的最大公约数
modPow(int n1, int n2) int 当前变量的n1次幂后,与n2取余
remainder(int n) int 当前变量与n取余后的结果
toDouble() double 当前变量的double类型表示
toRadixString(int n) String 当前变量转换至n进制的字符串表示
toString() String 当前变量的字符串表示
toStringAsExponential(int n) String 当前变量的*10n科学计数的字符串表示
toStringAsFixed(int n) String 当前变量带有n个小数位的字符串表示
toStringAsPrecision(int n) String 当前变量带有n个数位的字符串表示

int类型API示例

int a = 123;   //二进制数字 00000000 01111011
print("${a.bitLength}");  //占用了7bit
print("${a.isEven}");  //false   不是偶数
print("${a.isNegative}");  //false   不是负数
print("${a.toRadixString(16)}"); //7b   16进制是0x7b
print("${a.clamp(23, 78)}");  //78    最近的数字是78
print("${a.gcd(9)}");   //3   最大公约数是3
print("${a.remainder(2)}"); //1   与2取余得到1


1.2 double类型

Dart的double是IEEE 754标准中规定的64位浮点数。

  • double类里面有一个常量maxFinite,可以得到double类型的最大值
  • double类里面有一个常量minPositive,可以得到double类型的最小值
print(double.maxFinite);
print(double.minPositive);

如果一个num包含小数,那么它就是一个double类型。

double n1 = 3.14;
double n2 = 3.14e3;
print(n1); //3.14
print(n2); /3140.0;

double类型的API

API属性 返回值类型 说明
hashcode int hash码
isFinite bool 是否为有限数字(非无穷大)
isInfinite bool 是否为无限数字(无穷大)
isNegative bool 是否为负数
isNaN bool 是否为非数
runtimeType Type 当前对象的运行类型
sign int 当前对象的符号。取值为-1,0,1
API方法 返回值类型 说明
abs() double 当前变量绝对值
clamp(int n1, int n2); num 获得[n1,n2]区间距离当前变量最近的数字(n1 <= n2)
compareTo(int n) int 当前变量与n比较,根据比较结果返回-1,0,1
remainder(int n) double 当前变量与n取余后的结果
round() int 当前变量四舍五入后的取整结果
roundToDouble() double 当前变量四舍五入后的取整结果,浮点数形式表示
ceil() int 比当前变量大的最小整数(进一法)
ceilToDouble() double 比当前变量大的最小整数(进一法),浮点数形式表示
floor() int 比当前变量小的最大整数(退一法)
floorToDouble() double 比当前变量小的最大整数(退一法),浮点数形式表示
truncate() int 舍弃当前变量的小数部分
truncateToDouble() double 舍弃当前变量的小数部分,浮点数形式表示
toInt() int 当前变量转换为int类型(舍弃浮点数部分)
toString() String 当前变量的字符串表示
toStringAsExponential(int n) String 当前变量的*10n科学计数的字符串表示
toStringAsFixed(int n) String 当前变量带有n个小数位的字符串表示
toStringAsPrecision(int n) String 当前变量带有n个数位的字符串表示

double类型API示例

double a = 17.99;
print("${a.floor()}");  //12  退一法
print("${a.ceil()}");  //13  进一法
print("${a.round()}");  //13  四舍五入
print("${a.remainder(4)}");  //0.9900000000000002   与4取余,浮点数有个精度的尾巴
print("${a.isNegative}");  //false  不是负数
print("${a.toStringAsExponential(3)}");  //1.299e+1  科学计数法表示

通过int类型的API将int类型转换为double类型

int a = 32;
double b = a.toDouble();
print(b); //32.0

通过double类型的API将double类型转换为int类型(舍弃小数部分)

double a = 3.14;
int b = a.toInt();
print(b); //3

2. String类型

  • Dart里面的String使用UTF-16字符集编码。
  • 可以使用单引号或双引号来创建一个字符串,但必须成对使用。
  • 单引号或者双引号里面嵌套使用引号。
  • 用{}来显示字符串中变量的值,如果是表达式需要使用${表达式}
2.1 String字符常量

使用双引号或单引号创建字符串

String str1 = "I like girl";
String str2 = 'I like gril';

引号的嵌套使用,引号使用\"或\'进行转义

String str1 = "say:'Hello World!'";
String str2 = 'say:"Hello World!"';
String str3 = "say:\"Hello World!\"";
String str4 = 'say:\'Hello World!\'';

多行文本,使用三引号('''或""")

String str = '''多行文本测试1
测试2
测试3''';

使用+进行文本的拼接

String s1 = "hello";
String s2 = "world";
print(s1+" "+s2);

String类型的API

API属性 返回值类型 说明
length int 字符个数
hashcode int 哈希码
isEmpty bool 是否为空字符串,不能进行null检测
isNotEmpty bool 是否为非空字符串,不能进行null检测
codeUnits List 字符序列的ASC码组成的集合
runtimeType Type 当前对象的运行类型
runes Runes 字符序列的ASC码组成的序列
API方法 返回值类型 说明
codeUnitAt(int n) int 位置是n的字符的ASC码
compareTo(String str) int 字符串与str比较,根据比较结果返回-1,0,1
contains(String str, int n) bool 字符串中从n位置起是否包含str子串,省略参数n表示从位置0起
startsWith(String str) bool 字符串是否以子串str开始
endWith(String str) bool 字符串是否以子串str结束
indexOf(String str, int n) int 字符串第n个位置起,str第一次出现的位置,若没有出现过,返回-1。省略参数n表示从位置0起
lastIndexOf(String str, int n) int 字符串第n个位置起,str最后一次出现的位置,若没有出现过,返回-1。省略参数n表示从位置0起
padLeft(int n, String str) String 使用str在字符串的左侧将字符串补齐至n个长度(str无论多长只算1个长度),省略str参数表示使用空格(" ")进行补齐。
padRight(int n, String str) String 使用str在字符串的右侧将字符串补齐至n个长度(str无论多长只算1个长度),省略str参数表示使用空格(" ")进行补齐。
replaceAll(String str1, String str2) String 使用str2替换字符串中所有的str1子串
replaceRange(int n1, int n2, String str) String 使用str替换字符串中位置是[n1,n2)的子串
split(String str) List 以str为分隔符将字符串分隔为字符串集合
substring(int n1, int n2) String 截取字符串[n1,n2)区间的子串,省略n2参数表示截取至字符串的结尾
toLowerCase() String 将字符串中所有存在大小写的字符全部转换为小写字母
toUpperCase() String 将字符串中所有存在大小写的字符全部转换为大写字母
trim() String 去掉字符串两端多余的空白字符(如:空格)
trimLeft() String 去掉字符串左侧多余的空白字符(如:空格)
trimRight() String 去掉字符串右侧多余的空白字符(如:空格)

String类型API示例

String s = "I like girl";
print("${s.codeUnitAt(0)}");  //字符I的ASC码:73
print("${s.indexOf('i')}");  //字符i第一次出现的位置3
print("${s.lastIndexOf('i')}");  //字符i最后一次出现的位置8
print("${s.substring(2,6)}");  //截取[2,6)  得到like
print("${s.contains('girl')}");  //是否包含girl   true
print("${s.endsWith('girl')}"); //是否以girl结尾  true
print("${s.toUpperCase()}");  //全部大写  I LIKE GIRL
print("${s.split(' ')}");  //以空格拆分字符串得到集合  [I, like, girl]

2.2 StringBuffer字符变量

StringBuffer是字符串变量,参照Java语言中的StringBuffer类理解,主要用于字符串拼接操作
StringBuffer类型的API

API属性 返回值类型 说明
length int 字符个数
hashcode int 哈希码
isEmpty bool 是否为空字符串,不能进行null检测
isNotEmpty bool 是否为非空字符串,不能进行null检测
runtimeType Type 当前对象的运行类型
API方法 返回值类型 说明
write(Object obj) void 在字符串结尾处拼接obj
writeln(Object obj) void 在字符串结尾处拼接obj后,换行
writeCharCode(int n) void 在字符串结尾处拼接以n为ASC码的字符
toString() String 将StringBuffer作为String返回

StringBuffer类型API示例

StringBuffer s = new StringBuffer();
s.write("Dart");
s.write("is");
s.writeln("fun!");
s.writeCharCode(97);
s.write(12);
print(s.toString());
print("${s.isEmpty}");
print("${s.isNotEmpty}");
print("${s.length}");

运行结果


运行结果

3. bool类型

表示逻辑的,其对应取值为

  • true 表示逻辑真
  • false 表示逻辑假

Dart的bool类型不像JavaScript语言中的boolean类型可以参与数值运算。
与Java语言中的boolean是一样的,不能参与类型转换同时也不参与数值运算。

bool b1 = true;
bool b2 = false;

4. List类型

Dart语言中的List类型结合了Java语言中集合和数组的优势,即可以使用下标直接访问,又提供了很多便利的API方法进行集合操作。
List可以分为变长方式和定长方式,分别对应Java语言中的集合和数组。它们的区别在于初始化集合时是否给定长度,操作也与集合和数组更靠近。

4.1 数组方式的List变量

数组的特点是定长,所以在声明List变量时给定初始长度,即认为List变量为数组。
声明数组式的List变量

List l1 = [1,2,3];  //声明一个长度是3的数组,初始化数据为1,2,3。
List l2 = new List(5); //声明一个长度是5的数组,数组的数据全部是null

操作数组式的List变量
通过下标直接对数组

List l2 = new List(5);
l2[0] = 32;
l2[1] = 33;

不能使用add方法向数组中赋值

List l2 = new List(5);
l2.add(32);  //运行异常
l2.add(33);  //运行异常

遍历数组
length属性可以得到数组长度

List l1 = [1,2,3];
for(int i = 0; i < l1.length; i++){
  print(l1[i]);
}
4.2 集合方式的List变量

集合的特点在于变长,在声明List变量时不给定初始长度,则认为变量为集合。
声明集合式List变量

List list = new List(); //不给定长度

操作集合式List变量
通过add方法向集合的结尾处添加数据

List list = new List();
list.add(33);
list.add(23);

在集合对应位置没有添加数据时,不能使用下标直接对集合赋值
但集合对应位置已有数据时,可以使用下标进行访问

List list = new List();
list.add(33); //位置0,数据33
list[0] = 13; //设置位置0数据为13  OK
list[1] = 32; //运行错误,位置1没有数据

遍历集合

List list = new List();
list.add(33);
list.add(4);
list.add(22);
list.add(18);
for(int i = 0; i < list.length; i++){
  print(list[i]);
}
4.3 List的API
API属性 返回值类型 说明
length int List对象的长度/元素个数
first E List中的第一个元素
last E List中的最后一个元素
isEmpty bool 集合是否为空,不能进行null检测
isNotEmpty bool 集合是否非空,不能进行null检测
hashcode int 哈希码
runtimeType Type 当前对象的运行类型
iterator Iterator 获得当前List的迭代器
reversed Iterable 获得当前List的倒序可迭代对象
single int 若当前List只有一个元素,则返回这个元素,若有多个元素则运行异常
API方法 返回值类型 说明
add(E obj) void 在List结尾处添加obj
addAll(Iterable obj) void 在List结尾处添加obj, obj为一个可迭代的对象
asMap() Map 使用下标和数据作为key-value,将List转换成Map
clear() void 清空List中的数据
contains(E obj) bool List中是否包含obj
elementAt(int n) E 获得List中,位置是n的数据
getRange(int n1, int n2) Iterable 获得List中[n1,n2)位置所有数据组成的可迭代对象
indexOf(E obj, int n) int 在List中的第n个位置起,寻找obj第一次出现的位置,省略参数n表示从0开始,没有找到obj返回-1
lastIndexOf(E obj, int n) int 在List中的第n个位置起,寻找obj最后一次出现的位置,省略参数n表示从0开始,没有找到obj返回-1
insert(E obj, int n) void 在List的第n个位置,插入数据obj
remove(E obj) bool 移除List中第一个obj,obj存在返回true,obj不存在返回false
removeAt(int n) E 移除并返回List中第n个位置上的元素
removeLast() E 移除并返回List结尾的元素
removeRange(int n1,int n2) void 移除List中[n1,n2)位置的所有数据
skip(int n) Iterable 获得跳过起始n个元素的可迭代对象
take(int n) Iterable 获得起始n个元素的可迭代对象
toSet() Set 将List对象转储为Set,List中重复的数据只保留一个

5. Set类型

Dart中的Set类型类似Java中的Set集合,但区别的是Java中的Set集合被称为“无序(号)不重复”,通常在数据中存储的顺序由实现类(HashSet或TreeSet等)实现。而Dart中的Set集合按照存储顺序存放,不能存放重复数据,但可以通过elementAt方法根据序号访问。
Set不可使用下标直接访问,不能直接创建定长的对象。

Set set = new Set();
set.add(13);
set.add(4);
set.add(14);
set.add(24);
set.add(14);
set.add(11);
var s = set.elementAt(2); //访问位置2的元素
print(s);
print(set);

运行结果


运行结果

Set的API

API属性 返回值类型 说明
length int Set对象的元素个数
first E Set中的第一个元素
last E Set中的最后一个元素
isEmpty bool 集合是否为空,不能进行null检测
isNotEmpty bool 集合是否非空,不能进行null检测
hashcode int 哈希码
runtimeType Type 当前对象的运行类型
iterator Iterator 获得当前Set的迭代器
reversed Iterable 获得当前Set的倒序可迭代对象
single int 若当前Set只有一个元素,则返回这个元素,若有多个元素则运行异常
API方法 返回值类型 说明
add(E obj) void 在Set结尾处添加obj
addAll(Iterable obj) void 在Set结尾处添加obj, obj为一个可迭代的对象
clear() void 清空Set中的数据
contains(E obj) bool Set中是否包含obj
difference(Set s) Set 返回当前Set对象没有在参数集合s中出现的元素所组成的新的Set集合
elementAt(int n) E 获得Set中,位置是n的数据
remove(E obj) bool 移除Set中的obj,obj存在返回true,obj不存在返回false
skip(int n) Iterable 获得跳过起始n个元素的可迭代对象
take(int n) Iterable 获得起始n个元素的可迭代对象
toList() List 将Set对象转储为List

6. Map类型

Map类型是一种key-value形式存储数据的的类型,其中key值不能重复。

6.1 基本操作

创建map集合

Map map = new Map();
Map map = new Map();

添加和更新数据

Map map = new Map();
map[12] = "value";  //12为key   “value”是值   若key在集合中不存在,新增
map[12] = "test";  //key在集合中 存在,替换
print(map);

运行结果


运行结果

删除数据

map.remove(12); //移除key是12的数据
6.2 Map类型的API
API属性 返回值类型 说明
length int Map对象的键值对个数
entries Iterable 由键值对对象(MapEntry)组成的可迭代对象
keys Iterable 由所有键(key)数据组成的可迭代对象
values Iterable 由所有值(value)数据组成的可迭代对象
isEmpty bool 集合是否为空,不能进行null检测
isNotEmpty bool 集合是否非空,不能进行null检测
hashcode int 哈希码
runtimeType Type 当前对象的运行类型
API方法 返回值类型 说明
clear() void 清空Map中的所有键值对数据
containsKey(E obj) bool Map中的键部分是否包含obj
containsValue(E obj) bool Map中的值部分是否包含obj
remove(E obj) E 移除key=obj的键值对并返回value部分

7. Runes类型

Unicode为世界上所有的书写系统中使用的每个字母,数字和符号定义了唯一的数值。
Dart字符串是UTF-16代码单元的序列,所以在字符串中表达32位Unicode值需要特殊的语法。
Unicode代码点的常用方法是\uXXXX,其中XXXX是一个4位十六进制值。
要指定多于或少于4个十六进制数字,请将该值放在大括号中。

Runes r = new Runes("ABC");
print(r);

运行结果


运行结果

8. Symbole类型

不常用,翻译官网介绍
Symbol对象表示在Dart程序中声明的运算符或标识符。您可能永远不需要使用符号,但它们对于按名称引用标识符的API非常有用,因为缩小会更改标识符名称而不会更改标识符符号。

你可能感兴趣的:(第3章 Dart基础语法 -- 数据类型)