Kotlin的基本数值类型问题:是对象?还是基本数据类型?
前言
我們都知道Java中一直在說萬物皆對象,面向?qū)ο缶幊?但基本數(shù)據(jù)類型卻不是對象,
而Kotlin中的所有類型都是對象,包括基本數(shù)值類型和方法,
而數(shù)值對象的運行效率不如基本數(shù)據(jù)類型(具體請自行搜索);
猜測
那么,Kotlin中使用數(shù)值進行運算是否會比Java中使用數(shù)值運算效率更慢呢?
理論
在Java平臺上,Kotlin的數(shù)字類型被物理存儲為JVM原始類型,除非需要一個可空的數(shù)字引用(例如Int?)或涉及泛型;在后一種情況下,數(shù)字是裝箱的(也就是對象);
實踐
(一)現(xiàn)在隨便瞎寫一個算法來測試一下:
val startTime = System.currentTimeMillis()var a: Double = 0.0for (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類型的,看下五次的運行時間:
平均執(zhí)行時間為:141.4毫秒
(二)修改a為可null類型,進行測試:
val startTime = System.currentTimeMillis()var a: Double? = 0.0for (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的基本數(shù)據(jù)類型和非null時間近似,就不展示了
查看字節(jié)碼
不可空的基本類型
通過kotlin自帶的插件查看字節(jié)碼(反編譯后)如下
?
?可空的基本類型
?通過kotlin自帶的插件查看字節(jié)碼(反編譯后)如下
?
結(jié)論
Kotlin的數(shù)值類型設(shè)置為可null確實會損失性能(是對象類型的數(shù)值),所以若有和性能相關(guān)的運算(比如算法),請不要使用可null的數(shù)值類型.或者使用Java寫,使用Kotlin調(diào)用;
延伸
Java的對象數(shù)據(jù)類型會緩存一些值(Int的緩存范圍為-128到127),而Kotlin有沒有呢?
ps:Kotlin的==是比較的值, ===是比較的引用值
先比較非null的值
val test0: Int = 127val test1: Int = 127println(test0 === test1)結(jié)果為true
把它們兩個改為128也為true
結(jié)果:非null的數(shù)值類型確實是使用的基本數(shù)據(jù)類型
比較可null的值
val test0: Int? = 128val test1: Int? = 128println(test0 === test1)結(jié)果為false
把它們兩個改為127,打印true
結(jié)果:可null的數(shù)值類型是對象,并且也和Java一樣有緩存值
總結(jié)
以上是生活随笔為你收集整理的Kotlin的基本数值类型问题:是对象?还是基本数据类型?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 学习Kotlin(八)其他技术
- 下一篇: 发布开源库的踩坑经历:jitpack.i