kotlin基本数据类型(Kotlin——数组)
本文目录
Kotlin——数组
Kotlin为数组增加了一个Array类。为元素是基本类型的数组增加了XxxArray类(其中Xxx可以是Byte、Short、Int等基本类型) Kotlin自己提供了一套集合体系,Kotlin的集合体系抛弃了Java集合体系中的Queue集合,Kotlin集合体系中增加了可变集合和不可变集合。
Kotlin的数组使用Array《T》来代表,Kotlin的数组就是一个Array类的实例,因此Kotlin数组是引用类型
访问数组是通过在数组的索引后跟一个为数组元素赋值,调用的其实就是set(index,value)方法
上面的两种方式本质是一样的,在经过编译器编译优化后,会转换成根据数组的内存地址来访问数组元素,性能不会有任何损失
所有的数组都有 size 属性,通过这个属性可以访问到数组的长度。
for-in 循环可以自动遍历数组的每个元素
对数组使用for-in循环会被编译成使用基于索引的循环,并不会创建迭代器。因此具有良好的性能
kotlin数组提供了一个indices属性,这个属性可返回数组的索引区间
这种通过索引区间遍历的实现具有更好的性能,kotlin将会在底层将其编译成根据内存地址来访问元素,不需要额外创建区间对象
Kotlin还为数组提供了一个lastIndex属性,该属性用于返回数组最后一个元素的索引,size-1 如果需要同时访问数组的索引和元素,可以使用数组的 withIndex() ,该方法返回一个Iterable对象,该对象的所有元素都是IndexedValue.
Swift VS Kotlin
Swift和Kotlin作为更加"现代化"的语言,毫无疑问提升了开发原生app的效率,二者旨在与Objective-C和Java互操作,方便"旧"应用的开发进行更新,如果你要从零开始编写一个全新的应用,不要犹豫,选择使用它们,尽情享受它们带来的乐趣。这两个语言有着许多相似之处,让我们来"欣赏"一下吧: Kotlin有一个称为数据类的东西,该类在编译时将获得诸如hashCode(),toString()和copy()等方法。可以这样定义: Swift没有数据类或任何等效类。 Swift具有元组功能,并且可以为元组设定类型别名; Kotlin具有Pair和Triple工具类,用于呈现2元和3元组对象,并且可以通过data class模拟自定义元组。 Swift Struct和Class之间的区别在于,结构体是值类型,而类是引用类型。可将元组视为隐式定义的Struct: Kotlin没有Struct类型。但是,我们可以通过copy函数创建一个新引用: 我们可以使用Kotlin数据类和Swift结构体来保存数据。即使一个是引用类型,另一个是值类型。 Swift和Kotlin都有枚举。但是声明和匹配方式有很大的区别: Kotlint通过密封类可以实现枚举。Kotlin的Sealed Class和Swift的Enum之间的唯一区别是,密封类是引用类型,而Swift的Enum是值类型: Swift还具有隐式解包功能,它定义了一个可选内容,但告诉编译器可以展开该内容,因为后面它将会被值。Kotlin也可以通过lateinit关键字执行相同的操作。需要注意的是,作为开发人员,应尽可能避免使用隐式解包方式。 协议和接口有相同的功能,只是使用了不同的术语。它们定义了一个类在实现接口时必须遵循的一组函数/变量。Kotlin允许在接口的定义中使用泛型,而Swift则可以通过定义关联类型associatedtype来实现。 高阶函数本质上是接受闭包或函数作为参数并返回新值或另一个函数的函数。使用高阶函数,我们可以对值(例如数组)进行转换,过滤和迭代。 参考:
Kotlin Model类在Json反序列化过程为空性探索
定义一个JsonModel类。
使用Gson类进行反序列化,Gson版本2.8.5
我们看一下反编译出来的Java类,省略不必要的部分。
Boolean类型和Int类型都被编译成了Java原始类型。
这里注意一下 :Kotlin的Boolean、Byte、Short、Int、Long、Float、Double声明为非空类型的时候,最终反编译出来的Java类都会变成对应Java中原始类型:boolean、byte、short、int、long、float、double。而原始类型是都有默认值的,不会为null。
接下来开始探索:
完整的json字符串
如果反序列化的Json字符串没有 show 字段和 number 字段,那么最后反序列化出来的JsonModel对象, show = false , number = 0 。
ReflectiveTypeAdapterFactory.Adapter的read方法。
注释1处,循环判断是否还有下一个值需要处理。处理完string字段以后,json字符串中就没有其他要处理的字段了,也就是说,在Json字符串没有 show 字段和 number 字段的时候,根本不会处理这两个字段,所以都是默认值, show = false , number = 0 。
如果反序列化的Json字符串 show 字段和 number 字段都为 null ,那么最后反序列化出来的JsonModel对象, show = false , number = 0 。
ReflectiveTypeAdapterFactory.Adapter的read方法的注释2处,使用BoundField读取字段。
注释1处,如果是boolean类型,对应的变量是TypeAdapters.BOOLEAN,如果值为null的话,TypeAdapters.BOOLEAN返回的值是null。如果是int类型,对应的变量是TypeAdapters.INTEGER,如果值为null的话,TypeAdapters.INTEGER返回的值是null。
注释2处,条件不满足,所以Java原始类型变量如果对应的json字符串为null的话,最终反序列化的结果就是默认值, show = false , number = 0 。
注释1处,boolean类型变量,如果从json字符串中读取的值是null,返回null
int类型的适配器同理,如果从json字符串中读取的值是null,返回null,那么int类型的变量默认值就是0。
如果反序列化的Json字符串 string 字段缺失,那么在反序列化过程中就不会处理 string 字段,那么 string 字段就是默认值,在这个例子中我们没有给 string 字段赋默认值,所以默认值就是null,那么最后反序列化出来的JsonModel对象, string = null 。
注意: 注意: 注意:
如果我们如下所示,声明JsonModel类,给string字段默认赋值为"你好呀"。
反编译后的Java类,省略无关部分。
我们看到,JsonModel类没有默认的 无参构造函数 。并且只有当调用JsonModel三个参数的构造函数的时候,才会给string字段赋值。
当反序列化的Json字符串 string 字段缺失,反序列化后string字段会默认是"你好呀"吗?并不是。Gson在反序列化过程中要么通过调用 无参构造函数 来构造对象,或者通过 UnsafeAllocator 类,在不调用构造函数的情况下地分配对象。
所以如上声明方式,即使给string字段默认赋值为"你好呀"。在Json字符串string字段缺失的情况下,反序列化之后,string字段值依然为null。这里一定要注意!!!
如果反序列化的Json字符串 string 字段为 null ,那么最后反序列化出来的JsonModel对象, string = null 。
TypeAdapters.STRING
注释1处,值为null,返回null。
也就是说,对于一个引用类型的变量,如果Json字符串中该变量对应的值为null,那么反序列化出来的引用类型变量的值就是null。注意:并且会覆盖该变量的默认值。在这个例子中,我们如果在声明的时候为 string 字符指定一个默认值,但是当 json 字符串中 string 字段对应的值为 null 的时候,最后序列化出来的结果仍然为 null 。
所以正确的做法是把引用类型的变量声明为可空类型。如下所示:
反编译出来的Java类,对应的原始类型都变成了相应的包装类,默认值都是null。所以使用的时候要注意判断是否为null。
这种声明类型是不合适的,将可以不为null的Java基本数据类型,变为了可空的包装类型,使用的时候会增加空判断的逻辑。
更多文章:
指针函数和函数指针(感觉c++函数,指针太难,想先学python,不知各位大佬怎么看)
2023年5月15日 13:40
webgl和canvas性能比较(canvas动画性能好还是纯js动画性能好)
2024年6月6日 12:34
05网英语课课练答案(六年级英语课课练答案第90页和第91页的下册答案零五网)
2024年5月1日 04:19
python判断变量是否存在(当变量值等于6时,如何利用python表达式判断出变量是否在(1,20)区间内)
2024年7月18日 08:15
nginx负载均衡不生效(Nginx+SpringMVC 负载均衡中遇到的坑)
2024年7月27日 01:50
sql server安装介质(SQL server2008安装介质上文件的长路径名称不适用,求大神指点)
2024年7月14日 20:50
当前许可不支持影像服务器(安装solidworks2005时得到不了许可证 许可服务器不支持(-18,147,0)怎么办)
2024年8月12日 06:46
希望我的建议有用的英文(希望我的建议对你有所帮助用英语怎么说)
2024年7月9日 14:24
objective lens di 20x(2016职称英语词汇O开头:objective是什么意思及用法)
2024年7月23日 00:49
随机数字表的使用效率改进(excel表怎么设置随机数里面合格率控制在90%)
2024年6月28日 19:08
primary翻译(primary的中文意思是什么 primary的中文翻译)
2024年8月1日 14:10