Flutter开发之Dart的数据类型01,思维导图+源代码+笔记+项目

// 比较大小, 0:相同、1:大于、-1:小于
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的类型。
  • 只有两个对象是布尔类型的:truefalse 所创建的对象, 这两个对象也都是编译时常量
  • 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

DartList对象就是其他语言中的数组

创建数组

// 创建一个指定长度的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
  • 创建一个包含所有elementsList
  • elementsIterator规定了元素的顺序。
  • growabletrue(默认)时,构造函数返回一个可增长的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, 根据索引值创建元素
  • growablefalse时,创建的List是固定长度的

var l4 = new List.generate(3, (int i) => i * i);
l4.add(14);
print(l4);
// [0, 1, 4, 14]

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

文末

不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊~

小编将自己6年以来的面试经验和学习笔记都整理成了一个**937页的PDF,**以及我学习进阶过程中看过的一些优质视频教程。**上传在我的GitHub中:Android架构视频+BATJ面试专题PDF+学习笔记**请君自取,无偿分享!

源码讲义、实战项目、讲解视频**
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-YSYJXsOm-1711183218449)]

文末

不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊~

小编将自己6年以来的面试经验和学习笔记都整理成了一个**937页的PDF,**以及我学习进阶过程中看过的一些优质视频教程。**上传在我的GitHub中:Android架构视频+BATJ面试专题PDF+学习笔记**请君自取,无偿分享!

[外链图片转存中…(img-ungK8Tjl-1711183218449)]

其实看到身边很多朋友抱怨自己的工资很低,包括笔者也是一样的,其原因是在面试过程中没有给面试官一个很好的答案。所以笔者会持续更新面试过程中遇到的问题,也希望大家和笔者一起进步,一起学习。

  • 8
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值