print(d0.compareTo(30));
// 获取绝对值
print(d0.abs());
// 四舍五入
print(d0.round()); // 13
// 向上取整
print(d0.ceil()); // 14
// 向下取整
print(d0.floor()); // 13
// 输出的double类型, 相当于d0.round().toDouble()
print(d0.roundToDouble()); // 13.0
print(d0.ceilToDouble()); // 14.0
print(d0.floorToDouble()); // 13.0
// 保留指定的小数位数(四舍五入), 不足补0, 字符串返回
print(d0.toStringAsFixed(2)); // 13.10
// 保留变量的位数(小数点前后的总位数), 不足补0, 多余的四舍五入
print(d0.toStringAsPrecision(10)); // 13.09870000
/** toStringAsExponential
-
1.toStringAsExponential(); // 1e+0
-
1.toStringAsExponential(3); // 1.000e+0
-
123456.toStringAsExponential(); // 1.23456e+5
-
123456.toStringAsExponential(3); // 1.235e+5
-
123.toStringAsExponential(0); // 1e+2
*/
/** toStringAsPrecision
-
1.toStringAsPrecision(2); // 1.0
-
1e15.toStringAsPrecision(3); // 1.00e+15
-
1234567.toStringAsPrecision(3); // 1.23e+6
-
1234567.toStringAsPrecision(9); // 1234567.00
-
12345678901234567890.toStringAsPrecision(20); // 12345678901234567168
-
12345678901234567890.toStringAsPrecision(14); // 1.2345678901235e+19
-
0.00000012345.toStringAsPrecision(15); // 1.23450000000000e-7
-
0.0000012345.toStringAsPrecision(15); // 0.00000123450000000000
*/
Booleans
- 为了代表布尔值,
Dart
有一个名字为bool
的类型。 - 只有两个对象是布尔类型的:
true
和false
所创建的对象, 这两个对象也都是编译时常量 - 当
Dart
需要一个布尔值的时候,只有true
对象才被认为是true
, 所有其他的值都是flase
; 像 1、"aString"
、 以及someObject
等值都被认为是false
const m = 1;
if (m) {
print(‘是一个布尔值’);
} else {
print(‘不是一个布尔值’);
}
- 在
Dart
中上面判断语句是合法的代码 - 但是在
Dart
检查模式运行,上面的代码将会抛出一个异常,表示m
变量不是一个布尔值 - 所以不建议这么使用上述方法进行判断
Strings
Dart
字符串是UTF-16
编码的字符序列, 可以使用单引号或者双引号来创建字符串:
var s1 = ‘Single quotes work well for string literals.’;
var s2 = “Double quotes work just as well.”;
// 单引号里面有单引号(双引号里面有双引号)时, 必须使用反斜\杠转义
var s3 = ‘It’s easy to escape the string delimiter.’;
var s4 = “It’s even easier to use the other delimiter.”;
字符串的拼接
直接把相邻字符串写在一起,就可以连接字符串了
var string = ‘name’‘+’‘age’
用+把相邻字符串连接起来
var string1 = ‘name’ + ‘+’ + ‘age’;
引用变量
- 在
Dart
中使用$
符号引用变量或者表达式 - 表达式引用方式:
${表达式}
, 如果表达式是一个变量则{}
可以省略
const num1 = 12;
// 引用表达式
const ageStr0 = ‘age = $num1’;
const ageStr1 = ‘age = ${num1} is my age’;
// 引用表达式
const ageStr2 = ‘age = ${num1 * num1}’;
多行字符串
使用单引号或双引号的三引号
const line1 = ‘’’
道路千万条,安全第一条,
行车不规范,亲人两行泪
‘’';
const line2 = “”"
道路千万条,安全第一条,
行车不规范,亲人两行泪
“”";
转义符号
声明raw字符串(前缀为r)
,在字符串前加字符r
,或者在\
前面再加一个\
,可以避免\
的转义作用,在正则表达式里特别有用
// 转义字符
print(r’转义字符, \n’);
print(‘转义字符, \n’);
print(‘转义字符, \n’);
属性介绍
const string0 = ‘https://www.titanjun.top/’;
// 可根据索引获取字符串的每一个字符
print(string0[1]);
// 字符串是否是空的
print(string0.isEmpty);
print(‘’.isEmpty); // true
// 字符串是否不是空的
print(string0.isNotEmpty);
print(‘’.isNotEmpty); // false
// 返回字符串Unicode代码的可迭代对象
print(string0.runes);
// 返回字符串的UTF-16代码单元列表
print(string0.codeUnits);
// 返回根据代码单元生成的哈希码
print(string0.hashCode);
// 字符串的长度
print(string0.length);
// 返回对象运行时的类型
print(string0.runtimeType); // String
方法介绍
const string0 = ‘https://www.titanjun.top/’;
// 字符串比较
print(‘titan’.compareTo(‘jun’));
// 大小写转换
print(string0.toUpperCase());
print(string0.toLowerCase());
// 截取字符串(开头索引和结尾索引)
print(string0.substring(0, 5)); // https
// 只有开头索引, 默认截取到最后
print(string0.substring(12)); // titanjun.top/
// 拆分字符串
print(string0.split(‘.’)); // [https://www, titanjun, top/]
print(string0.split(new RegExp(r"t"))); // [h, , ps://www., i, anjun., op/]
// 去掉字符串里面的tab空格和换行符
const string1 = ‘\t\ttitanjun top\n’;
print(string1.trim());
// 去掉字符串开头的tab空格和换行符
print(string1.trimLeft());
// 去掉字符串结尾的tab空格和换行符
print(string1.trimRight());
endsWith
判断字符串是否以某字符(字符串)结尾, 参数不接受正则表达式
const str1 = ‘titanjun.top’;
print(str1.endsWith(‘p’)); //true
print(str1.endsWith(‘/’)); //false
print(str1.endsWith(‘top’)); //true
startsWith
bool startsWith(Pattern pattern, [int index = 0]);
判断字符串是否以某字符(字符串)开头, 参数接受正则表达式
const str1 = ‘titanjun.top’;
print(str1.startsWith(‘h’)); //false
print(str1.startsWith(‘tit’)); //true
print(str1.startsWith(‘it’, 1)); //true
print(str1.startsWith(new RegExp(r’[A-Z][a-z]'), 1)); //false
indexOf
int indexOf(Pattern pattern, [int start]);
- 根据指定的字符(字符串)获取其在原字符串中第一次出现的索引值, 顺序是从左到右
- 可以从指定的索引初开始, 默认从0开始
- 如果原字符串中没有需要查找的字符(字符串), 则返回值为: -1
const str2 = ‘https://www.titanjun.top/’;
print(str2.indexOf(‘titan’)); // 12
print(str2.indexOf(‘t’, 5)); // 12
print(str2.indexOf(new RegExp(r’[a-z]'))); //0
// 如果没有改字符, 则会输出-1
print(str2.indexOf(‘ppp’)); // -1
lastIndexOf
int lastIndexOf(Pattern pattern, [int start]);
效果和indexOf
一样, 不同点则是: indexOf
的顺序是从左到右, lastIndexOf
是从右到左
const str2 = ‘https://www.titanjun.top/’;
print(str2.lastIndexOf(‘t’, 20)); //14
print(str2.indexOf(new RegExp(r’[a-z]'))); //0
// 如果没有改字符, 则会输出-1
print(str2.indexOf(‘ppp’)); // -1
补占位符
String padLeft(int width, [String padding = ’ ']);
String padRight(int width, [String padding = ’ ']);
- 在字符串前后补占位符
- 参数一: 想要得到的字符串的位数
- 参数二: 位数不足时, 补充的字符
const str3 = ‘12’;
print(str3.padLeft(2, ‘0’)); //12
print(str3.padRight(3, ‘0’)); // 120
contains
bool contains(Pattern other, [int startIndex = 0]);
- 判断字符串中是否包含某字符
- 判断指定索引处的字符是否是某字符
bool contains(Pattern other, [int startIndex = 0]);
const str = ‘Dart strings’;
print(str.contains(‘D’));
print(str.contains(new RegExp(r’[A-Z]‘)));
print(str.contains(‘D’, 0));
print(str.contains(new RegExp(r’[A-Z]'), 0));
替换字符
// 只能替换一次, 参数三为开始的索引值, 默认0
String replaceFirst(Pattern from, String to, [int startIndex = 0]);
// 替换所有符合条件的字符(字符串)
String replaceAll(Pattern from, String replace);
// 替换某一区间的字符
String replaceRange(int start, int end, String replacement);
// 示例如下:
// 替换字符串
const str4 = ‘titanjun12–0123’;
print(str4.replaceFirst(‘t’, ‘T’)); // Titanjun12–0123
print(str4.replaceFirst(‘12’, ‘21’, 10)); //titanjun12–0213
// 全部替换
print(str4.replaceAll(‘12’, ‘21’)); //titanjun21–0213
print(str4.replaceAll(‘t’, ‘T’)); //TiTanjun12–0123
// 区间替换
print(str4.replaceRange(0, 5, ‘top’)); //topjun12–0123
List
在Dart
中List
对象就是其他语言中的数组
创建数组
// 创建一个指定长度的List, 不能添加/删除元素
List([int length]);
//通过指定长度创建一个固定长度的List,并使用fill初始化每个位置的值, 不能添加/删除元素
List.filled(int length, E fill, {bool growable: false});
//创建一个包含所有elements的List,
//当growable为true(默认)时,构造函数返回一个可增长的List。 否则,它返回一个固定长度的List
List.from(Iterable elements, {bool growable: true})
//生成一个包含所有值的List
//除非growable为true(默认),否则创建的List是固定长度的
List.generate(int length, E generator(int index), {bool growable: true})
//创建一个包含所有elements的,不能改变它的长度或元素
List.unmodifiable(Iterable elements)
List
- 如果设置了参数
length
(length
不能为负数或null
),那么创建的List
是固定长度的 - 元素可修改, 元素个数不可修改, 不能删除和增加元素
var l1 = new List(3); //[null, null, null]
print(l1.length); //3
// 下面这种写法会报错
l1.length = 1;
如果未设置参数length
,那么List
的长度是0,并且是可增长的
// 这两种方式一样
var l10 = new List();
var l11 = [];
// 都是可行的
l10.length = 3;
l10.add(1);
当使用指定长度创建一个可增长的List
时,仅仅在刚创建后分配长度
List growableList = new List()…length = 500;
filled
- 通过指定长度创建一个固定长度的
List
,并初始化每个位置的值 - 所有的元素都是相同的
fill
值。 如果指定的值是一个可变对象,那么List
中所有的元素都是相同的对象,并且是可修改的
var l2 = new List.filled(3, ‘l’); //[l, l, l]
var l3 = new List.filled(2, []); // [[], []]
l3[0].add(12);
print(l3); // [[12], [12]]
from
- 创建一个包含所有
elements
的List
elements
的Iterator
规定了元素的顺序。- 当
growable
为true
(默认)时,构造函数返回一个可增长的List
。 否则,它返回一个固定长度的List
var l5 = new List.from([1, 2, 3, 4]);
l5.add(5);
print(l5); // [1, 2, 3, 4, 5]
// 下面的add方法会报错
var l5 = new List.from([1, 2, 3, 4], growable: false);
l5.add(5);
generate
- 生成一个包含所有值的
List
, 根据索引值创建元素 growable
为false
时,创建的List
是固定长度的
var l4 = new List.generate(3, (int i) => i * i);
l4.add(14);
print(l4);
// [0, 1, 4, 14]
unmodifiable
- 创建一个包含所有
elements
的,不可修改的List
- 不可修改的
List
不能改变它的长度或元素 - 如果元素本身是不可改变的,那么由此产生的
List
也是不可改变的
var l6 = new List.unmodifiable([1, 2, 3, 4]);
List属性
var arr1 = [1, 2, 3, 4];
// 数组的第一个和最后一个元素
print(arr1.first); // 1
print(arr1.last); // 4
// 判断数组是否为空
print(arr1.isNotEmpty); // true
print(arr1.isEmpty); // false
// 数组长度, 元素个数
print(arr1.length); // 4
// 倒序返回List
print(arr1.reversed); // [4, 3, 2, 1]
// 返回Iterator,被允许迭代Iterable的所有元素
print(arr1.iterator);
// 对象的运行时类型
print(arr1.runtimeType); // List
// 获取对象的哈希值
print(arr1.hashCode);
// 根据索引获取元素
print(arr1[2]);
// 根据索引修改元素
arr1[1] = 11;
print(arr1);
List方法
增加
// 添加元素
arr1.add(5);
// 添加一个数组
arr1.addAll([10, 12]);
查找
var arr2 = [‘one’, ‘two’, ‘three’, ‘one’, ‘four’];
// 是否包含某元素
print(arr2.contains(‘one’)); // true
// 判断数组是否有满足条件的元素
print(arr2.any((item) => item.length > 4)); // true
// 判断数组是否所有元素都满足条件
print(arr2.every((item) => item.length > 4)); // false
// 转化为Map类型, 索引作为Key值,对应的元素作为Value
print(arr2.asMap()); // {0: one, 1: two, 2: three, 3: one, 4: four}
//随机打乱List中的元素
arr2.shuffle();
// 通过索引获取元素, 等价于arr2[3]
print(arr2.elementAt(3));
// 获取元素对应的索引值, 默认从索引0开始
print(arr2.indexOf(‘one’)); // 0
// 从第2个索引开始查找
print(arr2.indexOf(‘one’, 2)); // 3
// 如果找不到, 返回-1
print(arr2.indexOf(‘five’)); // -1
// 获取元素对应的索引值, 从后往前找
print(arr2.lastIndexOf(‘one’));
print(arr2.lastIndexOf(‘one’, 3));
print(arr2.lastIndexOf(‘five’));
// 返回满足条件的第一个元素
print(arr3.firstWhere((item) => item == ‘one’));
// 查找符合条件的元素, 如果有且仅有一个符合条件的元素, 则返回该元素
// 如果没有匹配到元素,或匹配到多个元素, 则会抛出异常
print(arr2.singleWhere((item) => item.length == 5)); //three
// 返回除了最初的count个元素外的所有元素
arr2 = [‘one’, ‘two’, ‘three’, ‘four’];
print(arr2.skip(2)); // (three, four)
// 返回所有不符合该条件的元素
print(arr2.skipWhile((item) => item.length == 3)); //(three, four)
// 返回一个新的List,包含从start(包括)到end(不包括)的对象, 原数组不变
print(arr2.sublist(1, 3));
// 不指定end, 默认到数组结尾
print(arr2.sublist(2));
// 获取某一区间的元素, 返回一个数组
print(arr2.getRange(1, 3)); // [‘two’, ‘three’]
// 数组拼接成字符串
print(arr2.join()); //onetwothreefour
print(arr2.join(‘-’)); //one-two-three-four
// 返回数组最初的count个元素
print(arr2.take(2));
// 返回数组符合条件的元素, 直到条件值为false停止过滤
arr2 = [‘one’, ‘two’, ‘three’, ‘four’, ‘ten’];
print(arr2.takeWhile((item) => item.length == 3)); //(one, two)
删除
var arr2 = [‘one’, ‘two’, ‘three’, ‘one’, ‘four’];
// 删除指定的元素
// 如果有该元素, 返回true
print(arr2.remove(‘two’)); // true
print(arr2); // [one, three, one, four]
// 如果没有该元素, 返回false
print(arr2.remove(‘five’)); // false
// 根据索引删除, 返回被删除的元素值
print(arr2.removeAt(1)); // three
print(arr2); // [one, one, four]
// 删除最后一个元素, 返回该元素值
print(arr2.removeLast()); // four
print(arr2); // [one, one]
// 删除一个区间的元素, 含左不含右[start, end)
arr2.addAll([‘six’, ‘seven’, ‘eight’]);
arr2.removeRange(1, 3);
print(arr2); // [one, seven, eight]
// 删除所有符合条件的元素
关于面试的充分准备
一些基础知识和理论肯定是要背的,要理解的背,用自己的语言总结一下背下来。
虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,我能明显感觉到国庆后多了很多高级职位,所以努力让自己成为高级工程师才是最重要的。
好了,希望对大家有所帮助。
接下来是整理的一些Android学习资料,有兴趣的朋友们可以关注下我免费领取方式。
①Android开发核心知识点笔记
②对标“阿里 P7” 40W+年薪企业资深架构师成长学习路线图
③面试精品集锦汇总
④全套体系化高级架构视频
**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水!
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!
来是整理的一些Android学习资料,有兴趣的朋友们可以关注下我免费领取方式。
①Android开发核心知识点笔记
②对标“阿里 P7” 40W+年薪企业资深架构师成长学习路线图
[外链图片转存中…(img-u2K9s5PZ-1714817430518)]
③面试精品集锦汇总
[外链图片转存中…(img-83AGFPwj-1714817430520)]
④全套体系化高级架构视频
**Android精讲视频领取学习后更加是如虎添翼!**进军BATJ大厂等(备战)!现在都说互联网寒冬,其实无非就是你上错了车,且穿的少(技能),要是你上对车,自身技术能力够强,公司换掉的代价大,怎么可能会被裁掉,都是淘汰末端的业务Curd而已!现如今市场上初级程序员泛滥,这套教程针对Android开发工程师1-6年的人员、正处于瓶颈期,想要年后突破自己涨薪的,进阶Android中高级、架构师对你更是如鱼得水!
[外链图片转存中…(img-IrpqOqkf-1714817430521)]
《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》,点击传送门,即可获取!