记上篇笔记后,继续学习
2、基本类型
2.1、?和 !!
// ?:表示当前是否对象可以为空
var recyclerView: RecyclerView?=null
// !!: 表示当前对象不为空的情况下执行
recyclerView!!.setHasFixedSize(true)
2.2、数字字面值中的下划线
// 增加数字常量的可读性
val phone = 188_6091_0348
2.3、== 和===
两个等号==:比较的对象的value。
三个等号===:比较的内存地址。
思考几个小问题:
1、下面加问号和不加问号有什么区别?
var a: Int = 128
var b: Int ?= 128
2、下面a==b和a===b的值各是多少
var a: Int = 127
var b: Int ?= 127
3、现在a==b和a===b的值各是多少
var a: Int = 128
var b: Int ?= 128
考验java基础的时候到了,这里有个小坑,反正我踩完了:采坑链接
恶补 :java的自动装箱和拆箱:
自动装箱和拆箱是重java1.5开始引入。自动装箱指Java自动将基本类型值转换成对应的对象,比如将int的变量转换成Integer对象,这个过程就叫装箱。反之拆箱就是将Integer对象转换成int类型值。
原理:自动装箱时编译器调用valueOf将基本数据类型转换为对象;自动拆箱时,编译器调用intValue()等类的方法将对象转为基础类型。
// 自动装箱栗子
// 1是int类型;而a是Integer,一个对象
Integer a = 1;
// 自动拆箱栗子
int a = new Integer(1);
注意:处于节省内存的考虑,JVM会缓存-128到127的Integer对象,当创建新的Integer对象时,如果对象值在-128到127区间里,并且已经存在相同值的对象,则返回这个对象,否则创建新的Integer对象。
详情参考:
https://droidyue.com/blog/2015/04/07/autoboxing-and-autounboxing-in-java/
https://www.jianshu.com/p/0ce2279c5691
2.4、显示转换
回顾下java的显示类型转换和隐式类型的转换。
隐式类型转换:又称自动类型转换,从存储范围小的类型到存储范围大的类型。
转换规则:byte → short(char) → int → long → float → double
示例代码:
// 这里,JVM首先将b的值转换为short类型,然后赋值给sh
byte b = 10;
short sh = b;
注意:比较大的整数类型转换成小数类型是,由于存储方式不同,可能存在数据精度的损失。
显示类型转换:就叫强制类型转换,简称强转。从存储范围大的类型到存储范围小的类型。改类类型转换课鞥呢存在精度的损失。
转换规则:double→float→long→int→short(char)→byte
int n = 123;
byte b = (byte)n; //123
int m = 1234;
byte b1 = (byte)m; //-46
回到kotlin,kotlin中较小的类型不能隐式转换成较大类型。所以要进行隐式转换,只能采用显示转换来实现。
// 显示拓宽
val b: Byte = 1
val i: Int = b.toInt()
每个数字类型支持如下转换:
—— toByte():Byte
—— toShort():Short
—— toInt():Int
—— toLong():Long
—— toFloat():Float
—— toDouble():Double
—— toChar():Char
2.5、数组
使用库函数arrayOf()来创建一个数组并添加元素值。
var array= arrayOf(1, 2, 3)
此外还有原生类型数组:ByteArray、 ShortArray、IntArray 等等
遍历数组:
var array = arrayOf(1, 2, 3)
for (s in array) {
Log.e("s is ", s.toString())
}
for (i in array.indices) {
Log.e("index is ", i.toString() + ", value is " + array[i])
}
for ((index, value) in array.withIndex()) {
Log.e("index is ", index.toString() + ", value is " + value)
}
补充:when表达式
kotlin里的when表达式取代了类C语言的switch操作符,也可以取代 if-else if链 :
when (x) {
1 -> print("x == 1")
2 -> print("x == 2")
else -> { // 注意这个块
print("x is neither 1 nor 2")
}
}
// 不提供参数
when {
x.isOdd() -> print("x is odd")
x.isEven() -> print("x is even")
else -> print("x is funny")
}
2.6、字符串模板
val i = 10
val s = "i = $i" // 求值结果为 "i = 10"
// 使用花括号
val s = "abc"
val str = "$s.length is ${s.length}" // 求值结果为 "abc.length is 3"