kotlin和java的对比
使用场景
kotlin主要是封装java,对java进行了优化
运行流程
java
编译时使用javac
java虚拟机内包含java运行时库
kotlin
编译时使用kotlinc
也需要通过jvm虚拟机解释执行
kotlin运行时专门有单独的运行时库
查看kotlin对应的java代码
- 找到kotlin生成的字节码
- 反编译字节码,查看java代码
基本数据类型
var b: Boolean = false//1byte
var byte: Byte = 0//1byte
var short: Short = 0//2byte
var i: Int = 0//4byte
var f: Float = 0f//4byte
var d: Double = 0.8989//8byte
var l: Long = 0L//8byte
val c: Char = 'c'//2byte
基本数据类型首字母是大写的
根据不同的使用场景,能自动的装箱和拆箱,底层java也是按原来的实现方式
智能类型推断和类型转换
var a = 10 类型推断为Int,类型安全,类型一旦确定就不能改变了
与js不同,kotlin是强类型语言
kotlin中基本数据类型的类型转换是使用toXxx(),使用to进行类型转换
对象类型的转换是使用as关键字
可变变量和不可变变量
var可变变量
val不可变变量
//常量
const val WEEK = "haha"
fun main() {
var a = 10
//不可变量,与常量不同,常量是编译时就确定的
//不可变量还可以通过反射修改值
val b = 20
a = 20
//b = 30
println(a)
println(b)
}
字符串
val s = “hello world”
原样输出
//原样输出
val ss = """
hello
world
""".trimIndent()
删除空格
//普通删除空格
val s1 = " aa "
println(s1.trim())
//kotlin中删除空格trimIndent()
val s2 = """
a
b
c
""".trimIndent()
//把前缀和空格删除
val s3 = """
6a
6b
6c
""".trimMargin("6")
字符串的比较
val s4 = "abc"
val s5 = String(charArrayOf('a', 'b', 'c'))
println(s4 == s5)//比较的是值 true
println(s4 === s5)//比较的是hashcode false
切割和截取
- split可以多条件切割
val s6 = "a.b+c"
val s61: List<String> = s6.split(".", "+")//[a,b,c]
- 截取
val s7 = "1234567"
println(s7.substring(0, 6))
println(s7.substring(0 until 6))//使用区间
//把3之前的字符串截取
println(s7.substringBefore("3"))//12
//把3之后的字符串截取
println(s7.substringAfter("3"))//4567
字符串模版
“${变量/表达式}”
元组
二元元组Pair
//姓名 年龄
//存储两个值
val pair = Pair("张三", 20)
println(pair.first)
println(pair.second)
val pair1 = "张三" to 20
println(pair.first)
println(pair.second)
三元元组Triple
//三元元组,存储三个值
val triple = Triple("张三", "zs", 30)
println(triple.first)
println(triple.second)
println(triple.third)
空值处理
//?表示可空类型
var s: String? = null
//强制告诉编译器不检查是否为空,如果对象为空,照样抛出异常
//s!!.toInt()
//空安全调用符?.,不会抛出异常
println(s?.toInt())
//?: elvis操作符
println(s?.toInt() ?: -1)
函数
输入输出函数
输出println()
输入readLine()
普通函数
顶层函数
不依赖于class类单独存在的函数
嵌套函数
函数中可以定义函数
var num = 10
fun say() {
//可以访问外部函数的属性
num = 11
println(num)
}
//调用时,必须在定义的后面
say()