前言

我们都知道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的基本数值类型问题:是对象?还是基本数据类型?相关推荐

  1. 【Kotlin】Kotlin 中使用 Lambda 表达式替代对象表达式原理分析 ( 尾随 Lambda - Trailing Lambda 语法 | 接口对象表达式 = 接口#函数类型对象 )

    文章目录 一.尾随 Lambda - Trailing Lambda 语法 二.Kotlin 中使用 Lambda 表达式替代对象表达式原理 1.Lambda 替换对象表达式 2.原理分析 3.示例分 ...

  2. Kotlin极简教程:第4章 基本数据类型与类型系统

    原文链接:https://github.com/EasyKotlin 到目前为止,我们已经了解了Kotlin的基本符号以及基础语法.我们可以看出,使用Kotlin写的代码更简洁.可读性更好.更富有生产 ...

  3. Java中,一切皆是对象,为何数据类型中还分为:基本类型和对象?

    Java中,一切皆是对象!为何数据类型中还分为:基本类型和对象?按理不应该只有一个类型-对象吗? 1.首先,Java中一切皆是对象!这句话没错,因为八种基本类型都有对应的包装类(int的包装类是Int ...

  4. python中一切数据都是对象吗_Python 对象中的数据类型

    对于python,一切事物都是对象,程序中存储的所有数据都是对象,对象基于类创建 计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据,不同的数据,需要定义不同的数据类型. ...

  5. Python xlrd 读取 Excel 表格基础(一):获取sheet、行、列对象,读取数据类型等

    Python xlrd 读取 Excel 表格基础 一:按行.按列读取Excel数据内容 前言: 1.获取工作簿.sheet对象 2.获取sheet表中行.列对象 3.读取sheet对象中所有数据 4 ...

  6. Windows Phone 7 页面的数值传递和对象传递

    一.Winodws Phone 7页面传递参数的方法: 1 .使用HyperlinkButton的NavigateUri属性,直接将传递的参数添加在NavigateUri的属性中.例如 <Hyp ...

  7. WP7页面的数值传递和对象传递

    一.Winodws Phone 7页面传递参数的方法: 1 .使用HyperlinkButton的NavigateUri属性,直接将传递的参数添加在NavigateUri的属性中.例如 <Hyp ...

  8. Kotlin入门(18)利用单例对象获取时间

    前面介绍了,使用扩展函数可以很方便地扩充数组Array的处理功能,例如交换两个数组元素.求数组的最大元素等等.那么除了数组之外,日期和时间的相关操作,也是很常见的,比如获取当前日期,获取当前时间.获取 ...

  9. JS:ES6-11 数值扩展与对象扩展

    数值扩展概述: 在ES5的基础上ES6 新增了一些数值方法: 代码实现: <!DOCTYPE html> <html> <head> <meta charse ...

最新文章

  1. Flask 重复启动
  2. Android中Canvas绘图之Shader使用图文详解
  3. mysql和mongodb替换字段中某字符
  4. 2014年第五届蓝桥杯C/C++ A组国赛 —— 第一题:海盗分金币
  5. MyEclipse内存溢出问题
  6. java 图片压缩100k_java实现图片压缩
  7. c#输入三个数选出最大的_C#习题,3、 输入三个数字,输出他们的最大值。(if) | 学步园...
  8. 7-3 时间换算 (15 分)
  9. UVA12265-Selling Land(细节处理)
  10. 2010工作代码总结之三(repostioryItemGridLookUpEdit下拉框)
  11. java并发编程(9)-- 线程池 创建 参数
  12. [2018.04.23 T3] 最大值
  13. python基础:购物车代码
  14. iOS APP 如何做才安全
  15. CSND自定义模块管理
  16. 淘宝数据分析实战篇(附源码)
  17. [论文笔记] Balboa: Bobbing and Weaving around Network Censorship
  18. h61 nvme硬盘_移动硬盘怎么选?看完这篇不踩坑
  19. e1000e网卡驱动分析—概述
  20. 答读者问(29):三个在校学生有关在校学习、考研、编程语言、未来工作的疑问及答复

热门文章

  1. 针对连续动作的DQN
  2. pyecharts 应用5:视觉映射配置项VisualMapOpts
  3. 编程语言中的Lambda 函数是如何产生的 它究竟有什么用
  4. MATLAB从入门到精通-欧拉法与梯形法求解微分方程(含MATLAB源码)
  5. 使用FP-growth算法发现频繁项集
  6. 【LeetCode从零单排】No15 3Sum
  7. make things simple
  8. mysql 造1亿条记录的单表--大数据表
  9. Linux中常用头文件的作用--转
  10. ios 中的基本算数函数