前言
我们都知道Java中一直在说万物皆对象,面向对象编程,但基本数据类型却不是对象,
而Kotlin中的所有类型都是对象,包括基本数值类型和方法,
而数值对象的运行效率不如基本数据类型(具体请自行搜索);
猜测
那么,Kotlin中使用数值进行运算是否会比Java中使用数值运算效率更慢呢?
理论
在Java平台上,Kotlin的数字类型被物理存储为JVM原始类型,除非需要一个可空的数字引用(例如Int?)或涉及泛型;在后一种情况下,数字是装箱的(也就是对象);
实践
(一)现在随便瞎写一个算法来测试一下:
val startTime = System.currentTimeMillis()
var a: Double = 0.0
for (i in 0..9999999) {
if (a != null) {
a += (i * 3 / 4 / 5 * 6 * 7 / 8)
a -= (i * 3 + a / 4)
}
}
println("值为$a,所用时间${System.currentTimeMillis() - startTime}")
上面的a是非null类型的,看下五次的运行时间:
平均执行时间为:141.4毫秒
(二)修改a为可null类型,进行测试:
val startTime = System.currentTimeMillis()
var a: Double? = 0.0
for (i in 0..9999999) {
if (a != null) {
a += (i * 3 / 4 / 5 * 6 * 7 / 8)
a -= (i * 3 + a / 4)
}
}
println("值为$a,所用时间${System.currentTimeMillis() - startTime}")
五次运行时间:
平均运行时间为:291毫秒,比非null时慢了整整一倍
而我用java的基本数据类型和非null时间近似,就不展示了
结论
Kotlin的数值类型设置为可null确实会损失性能(是对象类型的数值),所以若有和性能相关的运算(比如算法),请不要使用可null的数值类型.或者使用Java写,使用Kotlin调用;
延伸
Java的对象数据类型会缓存一些值(Int的缓存范围为-128到127),而Kotlin有没有呢?
ps:Kotlin的==是比较的值, ===是比较的引用值
先比较非null的值
val test0: Int = 127
val test1: Int = 127
println(test0 === test1)
结果为true
把它们两个改为128也为true
结果:非null的数值类型确实是使用的基本数据类型
比较可null的值
val test0: Int? = 128
val test1: Int? = 128
println(test0 === test1)
结果为false
把它们两个改为127,打印true
结果:可null的数值类型是对象,并且也和Java一样有缓存值