kotlin 中的数字

以下均来自官方文档:

一、整数类型

1、kotlin中内置的整数类型,有四种不同大小的类型:

类型存储大小(比特数)最小值最大值
Byte8-128127
Short16-3276832767
Int32-2,147,483,648 (-231)2,147,483,647 (231 - 1)
Long64-9,223,372,036,854,775,808 (-263)9,223,372,036,854,775,807 (263 - 1)

注:

当初始化一个没有显示指定类型的变量时,编译器会自动推断为自Int起足以表示该值的最小类型。意思是:如果不超过Int范围,那么类型为Int,如果超过了,那么类型是Long。如果指定值类型为Long类型,请给该值追加后缀L。如果显示的指定类型,会触发编译器检测该值是否超过指定类型的范围。

2、代码演示

// val或var来定义a = 1,打印类型,默认为java的int类型
fun main() {val a = 1// Kotlin的类型信息在运行时是基于JVM的,所以可以利用Java的反射API来获取类型信息println("类型为: ${a.javaClass.simpleName}") // 类型为: int
}

输出结果: 

 

// 下边打印输出类型为long类型,因为类型推断超出Int类型,所以输出long类型
fun main() {val a = 10000000000000println("类型为: ${a.javaClass.simpleName}") // 类型为: long
}

输出结果: 

显示指定Long类型

// 值后边加上L,来显示指定Long类型,或者 定义Long类型
fun main() {val a = 100Lval b: Long = 100println("类型为: ${a.javaClass.simpleName}") // 类型为: longprintln("类型为: ${b.javaClass.simpleName}") // 类型为: long
}

二、浮点类型

1、kotlin中内置的浮点类型:单精度Float与双精度Double类型

这两个类型的大小不同,并为两种不同精度的浮点数提供存储:

类型大小(比特数)有效数字比特数指数比特数十进制位数
Float322486-7
Double64531115-16

可以使用带小数部分的数字初始化Double与Float变量。小数部分与整数部分之间用点 .  分割,对于以小数初始化的变量,编译器会自动推断为Double类型:

fun main() {val a = 100.1println("类型为: ${a.javaClass.simpleName}") // 类型为: double
}

如果需要将一个值显式指定为Float类型,请添加 f F 后缀。如果值包含多于6到7位十进制数,那么会将其四舍五入:

// 实际测试Float类型多于4到5位十进制数,都会四舍五入,不知为啥!
fun main() {val a = 100.31415966 // 默认推断Double类型val b = 100.3141596f // 指定Float类型println("a为: ${a}") // a为: 100.31415966println("b为: ${b}") // b为: 100.31416
}

三、数字的装箱拆箱

1、在jvm平台,数字的存储为原生类型 int、double等。有例外的情况是:当创建可空数字引用如:泛型、Int? ···。在这些场景中,数字会装箱为JAVA类 Integer、Double等。

解释一下:在java世界里,有两种存放数字的方式:
(1)直接存储数字(原生类型):
        就像你在口袋里直接放了几块糖,你知道那是几块,可以直接用。在Java中,intdouble这些就是这种类型的糖,它们直接存数字,速度快,效率高。比如,你有个int num = 5;,这里的num就像你口袋里的5块糖,很直接。
(2)把数字放进盒子中,在存储(装箱类型):
        有时候,你可能想要更灵活一点,比如说,你的糖可能会没有(因为没买或者吃完了),这时候你就需要一个盒子来帮助你表示“有糖”或“没糖”。在Java中,如果你用IntegerDouble这样的类型,就像是给糖准备了个盒子。当你写Integer num = null;或用在泛型、可空类型如Int?时,就相当于,这个盒子里可能有糖(具体的数字),也可能什么都没有(null)。
装箱就是把简单直接的糖(原生类型)包装进一个盒子(变成对象,如Integer),这样可以做更多事情,比如表示“无糖状态”,但相对的,操作起来比直接拿糖要麻烦一点,因为每次要用糖时,都要从盒子里拿出来(拆箱)。
原生类型(如intdouble)直接存储数值,效率高;而像IntegerDouble这样的装箱类型,则是把数值包装成对象,可以表示额外的“无值”状态,但在使用时涉及到自动装箱和拆箱,稍微复杂一些。

2、代码演示

fun main() {val a: Int = 100// 装箱,赋值为可空的bval b: Int? = a// 装箱,赋值为可空的cval c: Int? = aval d: Int = 10000// 装箱,赋值为可空的eval e: Int? = d// 装箱,赋值为可空的fval f: Int? = dprintln(b === c) // trueprintln(e === f) // false
}

解释:

上边代码演示了装箱(boxing)和常量池(constant pool)的概念,这是理解打印结果差异的关键。
在Kotlin中,当一个原始类型(如Int)被赋值给一个可空类型(如Int?),这个过程被称为装箱,即原始类型值被封装成一个对象。但是,为了优化性能,Kotlin(以及Java)会对特定范围内的Int值(通常是-128到127)使用缓存,这意味着在这个范围内的值在装箱时会复用同一个对象。这就是所谓的享元模式(Flyweight Pattern),可以减少内存使用并提高效率。
分析代码:

  • 对于变量a,它的值是100,处于上述的缓存范围(-128到127)内。所以,当a被装箱赋值给bc时,这两个变量实际上引用的是同一个缓存中的Integer对象。因此,b === c比较的是两个对象的引用是否相同,结果为true,表示它们确实是同一个对象。

  • 变量d的值是10000,超出了常量池的缓存范围。因此,当d被装箱为e和f时,会为每个变量创建一个新的Integer对象,即使它们的值相同。这意味着ef是两个不同的对象,即使它们的数值相等。因此,e=== f比较的是不同对象的引用,结果为false

总结:

打印结果的不同是因为值为100的Int对象在装箱时被缓存并复用,而值为10000的Int对象由于超出缓存范围,每次装箱都会创建新的对象实例。这就解释了为什么第一个比较结果为true而第二个为false

再来看一段代码:

fun main() {val a: Int = 10000// 装箱,赋值为可空的bval b: Int? = a// 装箱,赋值为可空的cval c: Int? = aprintln(b == c) // true
}

为什么上边代码打印结果为true?

解释:

b == c打印出true的原因在于这里使用的是==操作符来进行比较,而不是===。在Kotlin中,==用于比较两个对象的内容(值)是否相等,而===用于比较两个引用是否指向同一个对象(即它们是否完全相同)。

分析代码:

当比较的是两个装箱的Int?类型变量(bc)时,==操作符会触发自动拆箱(unboxing),并将它们的原始Int值进行比较。在这个例子中,bc虽然是两个不同的对象(因为它们是分别装箱得到的),但它们的内部整数值都是10000,所以b == c的结果为true

总结:

b == c是比较的两个变量的值是否相等,而不是它们是否是同一个对象,所以结果是true

四、类型转换

1、数字类型的互转

  • toByte(): 转Byte类型 
  • toShort(): 转Short类型
  • toInt(): 转Int类型
  • toLong(): 转Long类型
  • toFloat(): 转Float类型
  • toDouble(): 转Double类型
fun main() {val a = 1 // 默认会推断为Int类型println(a.toByte()) // 1println(a.toInt()) // 1println(a.toFloat()) // 1.0println(a.toDouble()) // 1.0println(a.toLong()) // 1println(a.toShort()) // 1
}

五、大小比较及区间检测

1、kotlin中大小比较跟java一样

  • 相等性检测:a == b 与 a != b
  • 比较操作符:a < b、 a > b、 a <= b、 a >= b
  • 区间实例以及区间检测:a..b、 x in a..b、 x !in a..b

代码演示(.. 区间):

// a..b 表示从a到b这个区间
fun main() {for (i in 1..100){println(i) // 会打印1-100 的数字}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/26608.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

rsync常用命令

从远程服务器复制文件到本地 语法&#xff1a; rsync [options] userremote_host:/path/to/remote/source /path/to/local/destination示例&#xff1a; rsync -avz -e ssh userremote_host:/path/to/remote/source/ /path/to/local/destination/从本地复制文件到远程服务器…

Qt | QTextStream 类(文本流)

01、字符编码 1、怎样将字符转换为二进制形式进行存储,存在一个编码的问题,通常都需进行两次编码, 2、字符集:字符的第一次编码是将字符编码为与一个数值(如一个 10 进制整数)相对应,比如把字符 A 编码为 10 进制的 65,B 编码为 66 等。把每一个字符都编码为与一个数值…

现货黄金交易多少克一手?国内外情况大不同

如果大家想参与国际市场上的现货黄金交易&#xff0c;就应该从它交易细则的入手&#xff0c;先彻底认识这个品种&#xff0c;因为它是来自欧美市场的投资方式&#xff0c;所以无论是从合约的计的单位&#xff0c;计价的货币&#xff0c;交易的具体时间&#xff0c;以及买卖过程…

AMS(ActivityManagerService)源码解析2,Android应用是如何被启动的

一个Android应用是如何被启动的 前言总结1. 启动Application1.1 拉起一个新的进程1.2 启动Application1.3 AMS阶段1.4 创建Instrumentation和Application 2. 启动Activity2.1 回到AMS&#xff0c;启动第一个Activity 参考资料 前言 基于源码API 28&#xff0c;30以后的版本启动…

【Python/Pytorch - 网络模型】-- 手把手搭建3D VGG感知损失模型

文章目录 文章目录 00 写在前面01 基于Pytorch版本的3D VGG代码02 论文下载 00 写在前面 感知损失&#xff1a;对于提升图片的肉眼可见细节&#xff0c;效果十分明显&#xff1b;对于一些指标如&#xff08;SSIM、PSNR&#xff09;这些&#xff0c;效果不明显。 在01中&…

springboot集成swagger、knife4j

1. 集成swagger2 1.1 引入依赖 <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 --><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</vers…

【Three.js】知识梳理十九:线性雾(Fog)、指数雾(FogExp2)和范围雾(RangeFog)

雾是3D图形中创建深度和氛围的重要工具。Three.js提供了多种类型的雾&#xff1a;线性雾&#xff08;THREE.Fog&#xff09;&#xff0c;指数雾&#xff08;THREE.FogExp2&#xff09;和范围雾&#xff08;RangeFog&#xff09;。本文将探讨这三种类型的雾&#xff0c;通过代码…

MATLAB神经网络---序列输入层sequenceInputLayer

序列输入层sequenceInputLayer 描述一&#xff1a; sequenceinputlayer是Matlab深度学习工具箱中的一个层&#xff0c;用于处理序列数据输入。它可以将输入数据转换为序列格式,并将其传递给下一层进行处理。该层通常用于处理文本、语音、时间序列等类型的数据。在使用该层时&…

【大数据】Spark使用大全:下载安装、RDD操作、JAVA编程、SQL

目录 前言 1.下载安装 2.RDD操作 3.JAVA编程示例 4.Spark SQL 前言 本文是作者大数据系列中的一文&#xff0c;专栏地址&#xff1a; https://blog.csdn.net/joker_zjn/category_12631789.html?spm1001.2014.3001.5482 该系列会成体系的聊一聊整个大数据的技术栈&…

stable-diffusion 3 体验部署流程(ComfyUI)

环境准备 下载及简介 git clone https://huggingface.co/stabilityai/stable-diffusion-3-medium SD3 checkpoints&#xff1a; sd3_medium_incl_clips.safetensors (5.5GB)sd3_medium_incl_clips_t5xxlfp8.safetensors (10.1GB)sd3_medium.safetensors (4.3GB) 前两个可以…

文本相似度的三种算法

​为了实现基于嵌入向量相似度来查找输入文本与给定列表中最相似的元素&#xff0c;你可以使用预训练的文本嵌入模型&#xff08;例如&#xff0c;sentence-transformers&#xff09;&#xff0c;并计算输入文本与列表元素之间的余弦相似度。如果想避免依赖外部库或模型&#x…

SAP OB52 财务账期月结月底月初开关

公告&#xff1a;周一至周五每日一更&#xff0c;周六日存稿&#xff0c;请您点“关注”和“在看”&#xff0c;后续推送的时候不至于看不到每日更新内容&#xff0c;感谢。 这是一条刮刮乐&#xff0c;按住全部选中&#xff1a;点关注的人最帅最美&#xff0c;欢迎&#xff1…

roles安装wordpress

debug模块 1.如何查看ansible-playbook执行过程中产生的具体信息 vim test3.yaml --- - hosts: allremote_user: roottasks:- name: lsshell: ls /rootregister: var_stdout # register:将var_stdout注册为变量- name: debugdebug:var: var_stdout # 查看所有的输出信息#var…

vuInhub靶场实战系列--Kioptrix Level #4

免责声明 本文档仅供学习和研究使用,请勿使用文中的技术源码用于非法用途,任何人造成的任何负面影响,与本人无关。 目录 免责声明前言一、环境配置1.1 靶场信息1.2 靶场配置 二、信息收集2.1 主机发现2.1.1 netdiscover2.1.2 arp-scan主机扫描 2.2 端口扫描2.3 指纹识别2.4 目…

开源大模型GLM-4,超越Gemini、Qwen-VL-Max!附推理代码

简介 GLM-4-9B 是智谱AI推出的最新一代预训练模型GLM-4 系列中的开源版本。在语义、数学、推理、代码和知识等多方面的数据集测评中, GLM-4-9B及其人类偏好坐标的版本GLM-4-9B-Chat表现出超越Llama-3-8B的卓越性能。 除了能进行多轮对话,GLM-4-9B-Chat还提供了网页浏览、代码…

nodejs——原型链污染

一、引用类型皆为对象 原型和原型链都是来源于对象而服务于对象的概念&#xff0c;所以我们要先明确一点&#xff1a; JavaScript中一切引用类型都是对象&#xff0c;对象就是属性的集合。 Array类型、Function类型、Object类型、Date类型、RegExp类型等都是引用类型。 也就…

Unity创建简单的Http服务器/客户端测试

服务器部分&#xff1a; using System; using System.Collections; using System.Collections.Generic; using System.Net; using System.Threading.Tasks; using UnityEngine;/// <summary> /// 服务器部分 /// </summary> public class Sever_Yang : MonoBehavi…

Vue22-v-model收集表单数据

一、效果图 二、代码 2-1、HTML代码 2-2、vue代码 1、v-model单选框的收集信息 v-model&#xff1a;默认收集的就是元素中的value值。 单选框添加默认值&#xff1a; 2、v-model多选框的收集信息 ①、多个选择的多选 注意&#xff1a; 此处的hobby要是数组&#xff01;&…

【深度学习基础】激活函数:Tanh、Sigmoid 和 Softmax

激活函数是深度学习模型中不可或缺的一部分&#xff0c;它们赋予神经网络强大的非线性变换能力&#xff0c;使其能够拟合复杂的函数关系。在这篇博文中&#xff0c;我们将探讨三种常见的激活函数&#xff1a;Tanh、Sigmoid 和 Softmax&#xff0c;并提供一些记忆它们的技巧。 1…

海豚调度器自动监测每日报表及自动重跑异常工作流(综合应用可用代码

如何在海豚调度器自动监测报表是否跑出数据 海豚调度器调用api接口启动工作流(亲试可用) 海豚调度器调用api接口来获取工作流信息(获取processDefinitionId) 在前面的3篇文章,介绍了海豚调度器如何检测报表是否跑出数据,如果获取工作流信息和启动工作流。通过这3个步…