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