内容
- Kotlin中数据类型
- Kotlin中数字转换
- Kotlin中的Any类型
- Kotlin中的Unit类型
- Kotlin中的Nothing类型
- 集合泛型的可空性和集合的可空性比较
- 可变集合和不可变集合
- java集合到kotlin中将会变成平台集合
- Kotlin中的数组
一Kotlin中的数据类型
kotlin中数据类型有:整数类型:Byte,Short,Int,Long小数类型:Float,Double字符类型:Char布尔类型:Boolean。
java中八种基本数据类型对应的有八种包装类型,这是因为java中基本类型不能调用方法,所以提供了包装类型(这个和存储的地方不一样导致的这种结果)。
区别:Kotlin中没有对应的八中包装类型,是因为Kotlin在编译时期自动做了转换,而且基本类型也可以调用方法。
注意:Kotlin中的可空类型不能用Java的基本数据类型表示,因为null只能被存储在Java的引用类型的变量中。
二Kotlin中的数字转换
2.1数字之间转换
我们知道java中的数字类型都有范围,并且小范围向大范围之间会自动转换。同样的Kotlin中的数字类型也有范围,范围和java中的范围一致,不同的是,Kotlin中的范围不能自动转换,必须显示的调用他们内部提供的转换的方法。如
var a :Int = 1
var b :Long = a.toLong()必须显示的调用toLong方法,否则编译不通过。
延伸:写16进制的数,用0x开头;书写8进制的数,用0b开头;书写Float类型,后边加上f。
三kotlin中的Any类型
在java中所有引用类型的父类都是object,而基本数据类型的父类却不是object。同样的在kotlin中,基本数据类型和引用类型的父类全部是Any。本质是基本类型在编译的时候会自动装箱。所以Kotlin中Any就是我们java中的Object类型。
注意:在kotlin中想要声明一个变量可以是任何数,包括null,我们需要把类型写成Any?
四.Kotlin中的Unit类型
五Kotlin中的Nothing类型
我也不知道这个四干什么的,反正直到有这个类型就行了。
六集合泛型的可空性和集合的可空性比较
在Kotlin中集合的可空性和集合泛型的可空性是完全不一样的概念,如下边代码:
var list1 = ArrayList<Int?>()
var list2: ArrayList<Int>? = ArrayList()list1表示集合里边可以储存null值,而集合不能为null
list2表示集合可以为null,但是集合里边不能储存null值
七可变集合和不可变集合
我们直到java中没有单独的创建一个可变集合和不可变集合,而对于Kotlin丰富的这一功能。因为他是用不同接口平行分离处理:看下边代码:
val arr1: Collection<Int> = arrayListOf(1, 2, 3)arr1集合是一个不可变集合,因为我们在集合前边显示的声明了这个集合是不可变集合,它没有add方法。
val arr2: MutableCollection<Int> =arrayListOf(1, 2, 3)arr2集合是一个可变集合,因为我们在集合前边显示的声明了这个集合是可变集合,它有add方法。
val arr3: MutableCollection<Int> = arr1 as MutableCollection<Int>这行代码是不可变集合可以向可变集合进行转化。
注意:这些可变性可不可变性的定义完全是Kotlin自己定义的,对于和java互掉,他完全控制不了,例如我们写一个java工具类,向集合中添加一个元素:
#java代码
public class Utils {
public static void arradd4(Collection<Integer> arr) {
arr.add(4);
}
}同时我们在Kotlin中去调用这个方法,
val arr1: Collection<Int> = arrayListOf(1, 2, 3)
Utils.arradd4(arr1)
for (a in arr1){
Log.e("rrrrr","${a}")
}打印发现已经添加进去,和你声明可变不可变对于java代码没有影响,因为这是Kotlin为了更好的可读性,自己区分出来的可变集合和不可变集合的概念。
八平台集合类型
同java中的属性到kotlin中变成平台属性一样,java中的集合到kotlin中也会变成平台集合,这个时候你自己需要注意这些检查:
- 传递过来的集合对象是否为null
- 集合里边的内容是不是null
- 集合到底是可变的还是不可变的
九关于数组
数组的创建:
var arr = Array<String>(10) { i -> i.toString() }
var arr4 = arrayOf(1,2,3,4,5,6,7,8,9,10)他们会被转换成包装类型,这样会降低效率,我们怎么去创建基本类型的数组呢?
var arr5 = intArrayOf(1,2,3,4,5)
var arr6 = IntArray(100){i->i}同时数组拥有所有操作集合的操作符,如forEach,filter,map等
同时集合中都提供转换成数组的方法toxxxArray()。
小结:
Kotlin中只有八中基本数据类型,且都可以调用方法
Kotlin中的数字类型之间转换必须要显示的调用方法
Kotlin中的Any类型相当于java中的Object类型
Kotlin中的Unit类型相当于java中的void类型
Kotlin中的集合自己区分了可变类型和不可变类型,对于传递给java没有约束力
java中的集合在Kotlin中会变成平台集合,需要开发者自己考虑可读还是可写,集合是否为null,集合里边的内容是否为null
Kotlin中的数组的两种集合声明方法:Array<Int>(长度){值},arrayOf(值),他们都会编译成包装类型,
Kotlin中声明基本类型的数组,例如:intArrayof(内容),IntArray(长度){内容},他们效率更高
Kotlin中的数组拥有所有集合的中扩展方法,操作起来比java中操作数组方便很多
Kotlin中集合中都会有转换成基本类型的数组的方法:例如toIntArray()