Kotlin 基本数据类型
Kotlin的引用类型 只提供引用类型这一种数据类型,出于更高性能的需要,Kotlin编译器会在Java字节码中修改为基本数据类型。
Java有两种数据类型: 引用类型(堆内存) 基本数据类型(栈内存)
Kotlin 的基本数值类型包括 Byte、Short、Int、Long、Float、Double 等。不同于 Java 的是,字符不属于数值类型,是一个独立的数据类型。
类型 | 位宽度 |
---|---|
Double | 64 |
Float | 32 |
Long | 64 |
Int | 32 |
Short | 16 |
Byte | 8 |
内置数据类型(常用)
类型 描述
String 字符串
Char 单字符
Boolean true/false
Int 整形
Double 小数
List 集合
Set 无重复的元素集合
Map 键值对的集合
比较两个数字
在Kotlin中,用 ==
检查两个字符串中的字符是否匹配,用 ===
检查两个变量是否指向内存堆上同一对象,而在Java中 ==
做引用比较,做内容比较时用equals方法。
//字符串比较
val str1 = "Kotlin"
val str2 = "Kotlin"
val str3 = "kotlin".replace("k","K")
println("$str1-$str2-$str3")
//比较的是内容,true
println(str1 == str2)//true
println(str1 == str3)//true
//这里为什么是true,字符串内容不可变,Java和Kotlin有个字符串常量池
println(str1 === str2)//true
println(str1 === str3)//false
常量池:是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复创建相等变量时节省了很多时间。常量池其实也就是一个内存空间,常量池存在于方法区中。
String类也是Java中用得多的类,同样为了创建String对象的方便,也实现了常量池的技术。
equals
val str1 = "Kotlin"
val str2 = "Kotlin"
val str4 = "kotlin"
println(str1.equals(str2))//true
println(str1.equals(str4))//false
//第二个参数加true代表忽略大小写比较。
//第二个参数加false代表不忽略大小写比较。
println(str1.equals(str4,true))//true
布尔
布尔用 Boolean 类型表示,它有两个值:true 和 false。
若需要可空引用布尔会被装箱。
内置的布尔运算有:
|| – 短路逻辑或 && – 短路逻辑与 ! - 逻辑
和 Java 不一样,Kotlin 中的 Char 不能直接和数字操作,Char 必需是单引号 ' 包含起来的。比如普通字符 '0','a'。
fun check(c: Char) {
if (c == 1) { // 错误:类型不兼容
// ……
}
}
字符字面值用单引号括起来: '1'。 特殊字符可以用反斜杠转义。 支持这几个转义序列:\t、 \b、\n、\r、\'、\"、\\ 和 \$。 编码其他字符要用 Unicode 转义序列语法:'\uFF00'。
我们可以显式把字符转换为 Int 数字:
fun decimalDigitValue(c: Char): Int {
if (c !in '0'..'9')
throw IllegalArgumentException("Out of range")
return c.toInt() - '0'.toInt() // 显式转换为数字
}
当需要可空引用时,像数字、字符会被装箱。装箱操作不会保留同一性。
字符串
一、字符串创建
String类表示char类型的数组。字符串是不可变的,这意味着长度和元素在创建后不能更改。因为字符串对象是不可变的,所以可以共享它们。
fun main() {
val ch = charArrayOf('S', 'h', 'u', 'a', 'i', 'C', 'i')
val str = String(ch)
println(str)//ShuaiCi
}
字符串属性
属性 | 描述 |
---|---|
length: Int | 返回字符串序列的长度。 |
indices: IntRange | 返回当前 char 序列中有效字符索引的范围。 |
lastIndex: Int | 返回 char 序列中最后一个字符的索引。 |
var string1 ="school"
println(string1)
println(string1.length.toString()+ "=="+string1.indices)// 6 0..5
类型转换
由于不同的表示方式,较小类型并不是较大类型的子类型,较小的类型不能隐式转换为较大的类型。 这意味着在不进行显式转换的情况下我们不能把 Byte 型值赋给一个 Int 变量。
val b: Byte = 1 // OK, 字面值是静态检测的
val i: Int = b // 错误
var c:Int=2
var d:String =c+"" //错误
我们可以代用其toInt()方法。
val b: Byte = 1 // OK, 字面值是静态检测的
val i: Int = b.toInt() // OK
var d:String =i.toString //ok
每种数据类型都有下面的这些方法,可以转化为其它的类型:
toByte(): Byte toShort(): Short toInt(): Int toLong(): Long toFloat(): Float toDouble(): Double toChar(): Char
有些情况下也是可以使用自动类型转化的,前提是可以根据上下文环境推断出正确的数据类型而且数学操作符会做相应的重载。例如下面是正确的:
val l = 1L + 3 // Long + Int => Long