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】Kotlin 中使用 Lambda 表达式替代对象表达式原理分析 ( 尾随 Lambda - Trailing Lambda 语法 | 接口对象表达式 = 接口#函数类型对象 )
文章目录 一.尾随 Lambda - Trailing Lambda 语法 二.Kotlin 中使用 Lambda 表达式替代对象表达式原理 1.Lambda 替换对象表达式 2.原理分析 3.示例分 ...
- Kotlin极简教程:第4章 基本数据类型与类型系统
原文链接:https://github.com/EasyKotlin 到目前为止,我们已经了解了Kotlin的基本符号以及基础语法.我们可以看出,使用Kotlin写的代码更简洁.可读性更好.更富有生产 ...
- Java中,一切皆是对象,为何数据类型中还分为:基本类型和对象?
Java中,一切皆是对象!为何数据类型中还分为:基本类型和对象?按理不应该只有一个类型-对象吗? 1.首先,Java中一切皆是对象!这句话没错,因为八种基本类型都有对应的包装类(int的包装类是Int ...
- python中一切数据都是对象吗_Python 对象中的数据类型
对于python,一切事物都是对象,程序中存储的所有数据都是对象,对象基于类创建 计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据,不同的数据,需要定义不同的数据类型. ...
- Python xlrd 读取 Excel 表格基础(一):获取sheet、行、列对象,读取数据类型等
Python xlrd 读取 Excel 表格基础 一:按行.按列读取Excel数据内容 前言: 1.获取工作簿.sheet对象 2.获取sheet表中行.列对象 3.读取sheet对象中所有数据 4 ...
- Windows Phone 7 页面的数值传递和对象传递
一.Winodws Phone 7页面传递参数的方法: 1 .使用HyperlinkButton的NavigateUri属性,直接将传递的参数添加在NavigateUri的属性中.例如 <Hyp ...
- WP7页面的数值传递和对象传递
一.Winodws Phone 7页面传递参数的方法: 1 .使用HyperlinkButton的NavigateUri属性,直接将传递的参数添加在NavigateUri的属性中.例如 <Hyp ...
- Kotlin入门(18)利用单例对象获取时间
前面介绍了,使用扩展函数可以很方便地扩充数组Array的处理功能,例如交换两个数组元素.求数组的最大元素等等.那么除了数组之外,日期和时间的相关操作,也是很常见的,比如获取当前日期,获取当前时间.获取 ...
- JS:ES6-11 数值扩展与对象扩展
数值扩展概述: 在ES5的基础上ES6 新增了一些数值方法: 代码实现: <!DOCTYPE html> <html> <head> <meta charse ...
最新文章
- Flask 重复启动
- Android中Canvas绘图之Shader使用图文详解
- mysql和mongodb替换字段中某字符
- 2014年第五届蓝桥杯C/C++ A组国赛 —— 第一题:海盗分金币
- MyEclipse内存溢出问题
- java 图片压缩100k_java实现图片压缩
- c#输入三个数选出最大的_C#习题,3、 输入三个数字,输出他们的最大值。(if) | 学步园...
- 7-3 时间换算 (15 分)
- UVA12265-Selling Land(细节处理)
- 2010工作代码总结之三(repostioryItemGridLookUpEdit下拉框)
- java并发编程(9)-- 线程池 创建 参数
- [2018.04.23 T3] 最大值
- python基础:购物车代码
- iOS APP 如何做才安全
- CSND自定义模块管理
- 淘宝数据分析实战篇(附源码)
- [论文笔记] Balboa: Bobbing and Weaving around Network Censorship
- h61 nvme硬盘_移动硬盘怎么选?看完这篇不踩坑
- e1000e网卡驱动分析—概述
- 答读者问(29):三个在校学生有关在校学习、考研、编程语言、未来工作的疑问及答复