kotlin 中的数字

news2024/11/28 17:48:34

以下均来自官方文档:

一、整数类型

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 = 10000000000000
    println("类型为: ${a.javaClass.simpleName}") // 类型为: long
}

输出结果: 

显示指定Long类型

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

二、浮点类型

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

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

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

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

fun main() {
    val a = 100.1
    println("类型为: ${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.31415966
    println("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
    // 装箱,赋值为可空的b
    val b: Int? = a
    // 装箱,赋值为可空的c
    val c: Int? = a

    val d: Int = 10000
    // 装箱,赋值为可空的e
    val e: Int? = d
    // 装箱,赋值为可空的f
    val f: Int? = d

    println(b === c) // true
    println(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
    // 装箱,赋值为可空的b
    val b: Int? = a
    // 装箱,赋值为可空的c
    val c: Int? = a

    println(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()) // 1
    println(a.toInt()) // 1
    println(a.toFloat()) // 1.0
    println(a.toDouble()) // 1.0
    println(a.toLong()) // 1
    println(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.coloradmin.cn/o/1815862.html

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

相关文章

(Git)多人协作1

文章目录 前言总结 前言 目标&#xff1a;master分支下file.txt文件新增“aaa”,“bbb” 实现&#xff1a;开发者1新增“aaa”,开发者2新增“bbb” 条件&#xff1a;在同一个分支下协作完成 实际开发过程中&#xff0c;每个用户都与属于自己的码云账户&#xff0c;如果想要进…

闪烁与常亮的符号状态判断机制(状态机算法)

背景说明 在视觉项目中&#xff0c;经常要判断目标的状态&#xff0c;例如&#xff1a;符号的不同频率闪烁、常亮等。然而常规的视觉算法例如YOLO&#xff0c;仅仅只能获取当前帧是否存在该符号&#xff0c;而无法对于符号状态进行判断&#xff0c;然而重新写一个基于时序的卷积…

9 - 上升的温度(高频 SQL 50 题基础版)

9 - 上升的温度 -- 找出与之前&#xff08;昨天的&#xff09;日期相比温度更高的所有日期的 id -- DATEDIFF(2007-12-31,2007-12-30); # 1 -- DATEDIFF(2010-12-30,2010-12-31); # -1select w1.id from Weather w1, Weather w2 wheredatediff(w1.recordDate,w2.recordDat…

Android Studio项目升级报错:Namespace not specified

原项目升级AGP到8.0时报错&#xff1a; Namespace not specified. Specify a namespace in the modules build file: C:\Users\Administrator\Desktop\MyJetpack\app\build.gradle. See https://d.android.com/r/tools/upgrade-assistant/set-namespace for information about…

准研究生了解内容:如何挑选论文并下载

本文主要纪录自己从0开始摸索如何找论文&#xff0c;下载论文等的过程。 前言 &#xff08;一点想法&#xff09;## 作为准研究生&#xff0c;上岸后一直非常颓废&#xff0c;除了给人补课挣了点money&#xff0c;剩下时间都是打游戏&#xff0c;被老姐训诫后决定继续学习。毕…

1+x(Java)中级题库易混淆理论题(四)

Java 代码 15.2%5 的结果为0.2 super 关键字是在子类对象内部指代其父类对象的引用 IllegalAccessException 是访问权限不足构成的异常&#xff1b;ClassCastException 是类型转换异常&#xff1b;InputMismatchException 通常是使用 Scanner 输入数据时发生的异常。 List 集合…

分治法思想-归并排序案例图片详解

分治法简介 分治法思想 ​ 分治法&#xff0c;就是将一个难以解决的大问题给分成多个规模较小的子问题&#xff0c;分别解决各个子问题&#xff0c;最后合并子问题的解得到原问题的解。 分治法求解过程&#xff1a; 1、划分&#xff08;分&#xff09;&#xff1a; ​ 把规…

GEO ISP图像调试-PFC(蓝紫边校正)

目录 1、简单介绍 2、调试策略 3、输出结果 1、简单介绍 GEO中中调整图像蓝紫边可分为两步&#xff0c;第一步&#xff1a;调整蓝紫边检测区域&#xff0c;第二步&#xff1a;设置去蓝紫边强度。 2、调试策略 图1 该图像蓝紫边较严重 主要原因是由于蓝紫边检测不准导致的&…

怎么买充电宝不踩雷?六大充电宝选购攻略,1分钟选对充电宝!

充电宝是选快充好还是慢充好呢&#xff1f;充电宝的充电速度取决于多个因素&#xff0c;包括充电宝的容量、输入电流、充电线的质量等。一般来说&#xff0c;充电宝的充电速度可以通过输入电流来衡量&#xff0c;输入电流越大&#xff0c;充电速度越快。当我们面临选择充电宝的…

常说的上游服务和下游服务如何区分?

目录 上游和下游 &#xff08;upstream and downstream&#xff09;从信息的流向方向来看从依赖规则和价值规则来看 总结参考 上游和下游 &#xff08;upstream and downstream&#xff09; 一般在谈论服务和调用关系的时候&#xff0c;我们会使用上游和下游来表示服务间的相关…

【后端开发】服务开发场景之高可用(冗余设计,服务限流,降级熔断,超时重试,性能测试)

【后端开发】服务开发场景之高可用&#xff08;冗余设计&#xff0c;服务限流&#xff0c;降级熔断&#xff0c;超时重试&#xff0c;性能测试&#xff09; 文章目录 序&#xff1a;如何设计一个高可用的系统&#xff1f;可用性的判断指标是什么&#xff1f;哪些情况会导致系统…

小学姐教你HarmonyOS开发-02-ArkTS语言基础

简单介绍基于TypeScript扩展的ArkTS语言。 ArkTS是鸿蒙生态的应用开发语言&#xff0c;由ArkUI框架提供&#xff0c;以声明式开发范式来开发界面&#xff0c;让开发者可以更简洁、更自然的方式开发高性能应用。 源课程&#xff1a;d2school(第2学堂) 什么是ArkTS&#xff1f; …

免费的维吾尔语翻译工具,汉维翻译软件只推荐这一个《维汉翻译通App》,维吾尔文OCR字母识别!

免费维吾尔语翻译&#xff0c;真好用 《维汉翻译通》App提供免费的短文本翻译服务&#xff0c;支持翻译维吾尔语和汉语&#xff0c;无论是日常对话还是学术研究的内容&#xff0c;都能轻松应对。 维吾尔文OCR&#xff0c;文字识别新体验 高精度维文文字识别技术&#xff0c;让…

跟着AI学AI_11 PyTorch, TensorFlow 和JAX 功能对比简介

PyTorch, TensorFlow 和 JAX 功能对比简介 PyTorch、TensorFlow 和 JAX 是当前最流行的深度学习框架。它们各自具有独特的特性和优势&#xff0c;适合不同的应用场景和开发者需求。下面是对这三个框架的功能对比。 1. 基本概念和特性 PyTorch&#xff1a; 动态计算图&#xf…

王炸ChatGPT学术应用!从文献综述至定稿,轻松完成优质学术论文

智写论文 智写论文&#xff08;chatyy.cn&#xff09;是一款专注AI科研和学术写作的专业平台&#xff0c;AI论文写作、AI学术润色修改、科研分析、文献搜索和综述撰写&#xff0c;科研数据分析、英文学术润色&#xff0c;中英学术互译&#xff0c;文献查询和综述撰写&#xff…

知识图谱的应用---智慧外交

文章目录 智慧外交典型应用 智慧外交 智慧外交是指通过事件分析的手段&#xff0c;从历史、政治、经济、军事、文化等多个层面对各个国家的关系进行定量分析&#xff0c;提供智能化的外交关系研判和外交决策支撑。依托公开媒体、互联网及内部信息等海量资源数据&#xff0c;综合…

vivado HW_SIO_RX

HW_SIO_RX 描述 在硬件设备上&#xff0c;每个GT包括一个独立的接收器hw_sio_rx 由一个PCS和一个PMA组成。高速串行数据从板上的迹线流入 GTX/GTH收发器RX的PMA&#xff0c;进入PCS&#xff0c;最后进入FPGA逻辑。 相关对象 HW_SIO_RX对象与HW_server、HW_target、HW_device、H…

STM32F103 ADC

STM32 ADC 12位ADC是一种逐次逼近型模拟数字转换器,和比较型ADC相比&#xff0c;逐次逼近型ADC的优点是低功耗&#xff0c;缺点是速度慢。下图为逐次逼近型ADC。 ​ STM32F103的ADC有单次和连续转换两种模式&#xff0c;有通道扫描和单独工作两种模式&#xff0c;并且有校准和…

Gi标签管理

文章目录 前言理解标签创建标签操作标签总结 前言 理解标签 标签&#xff0c;可以理解为对某次commit的一次标识&#xff0c;相当于起起了一个别名。 例如&#xff0c;在项目发布某个版本时候&#xff0c;针对最后一次commit起一个v1.0这样的标签来标识里程碑的意义。 这有什…

inferCNV:scRNA-seq数据推断染色体拷贝数变化

inferCNV分析简介 inferCNV用于探索肿瘤单细胞RNA-Seq 数据&#xff0c;以确定体细胞大规模染色体拷贝数改变的证据&#xff0c;例如整个染色体或大片段染色体的增益或缺失。这是通过与一组参考“正常”细胞&#xff08;这里的正常细胞可自行定义&#xff09;进行比较&#xf…