| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 【Java核心技术】int和Integer的区别 -> 正文阅读 |
|
[Java知识库]【Java核心技术】int和Integer的区别 |
Java虽然号称是面向对象的语言,但是原始数据类型仍然是重要的组成元素,所以需要掌握原始数据类型和包装类等Java语言特性 探讨的问题:
一、典型回答int是常说的整形数字,是Java的8个原始数据类型(Primitive Types:
关于 二、考点分析这个问题涵盖了Java里的两个基础要素:原始数据类型、包装类 可以结合其他方面,考察以上知识点的掌握程度和思考逻辑,比如:
三、知识扩展3.1 理解自动装箱/拆箱自动装箱实际上算是一种语法糖 比如整数,javac自动把装箱转换为 如何程序化的验证上面的结论呢? 写一段简单的程序包含下面两句代码,然后反编译一下
反编译输出:
这种缓存机制并不是只有
自动装箱/自动拆箱似乎很酷,在编程实践中,有什么需要注意的吗? 原则上,建议避免无意中的装箱、拆箱行为,尤其是在性能敏感的场合
其实可以把这个观点扩展开,使用原始数据类型、数组甚至本地代码实现等,在性能极度敏感的场景往往具有比较大的优势,用其替换掉包装类、动态数组(如ArrayList)等可以作为性能优化的备选项 以经常会使用到的计数器实现为例,下面是一个常见的线程安全计数器实现
如果利用原始数据类型,可以将其修改为:
3.2 源码分析接下来分析Integer的源码 整体看一下Integer的职责:
进一步来看一些有意思的地方 3.2.1 缓存继续深挖缓存 缓存上限值实际是可以根据需要调整的,JVM提供了参数设置:
这些实现,都体现在java.lang.Integer源码之中,并实现在
3.2.2 字符串不可变在分析字符串的设计实现时,提到过字符串是不可变的,保证了基本的信息安全和并发编程中的线程安全 如果看包装类里存储数值的成员变量 这种设计是可以理解的,或者说是必须的选择 3.2.3 Integer等包装类定义常量
如果使用过其他语言(如C或C++),类似整数的位数其实是不确定的,可能在不同的平台(如32 位或64位平台),存在非常大的不同 其实,这种移植对于Java来说相对要简单些,因为原始数据类型是不存在差异的,这些明确定义在Java语言规范里面,不管是32位还是64位环境,开发者无需担心数据的位数差异 对于应用移植,虽然存在一些底层实现的差异,比如64位HotSpot JVM里的对象要比32位 HotSpot JVM大(具体区别取决于不同JVM实现的选择),但是总体来说并没有行为差异,应用移植还是可以做到宣称的一次书写,到处执行,应用开发者更多需要考虑的是容量、能力等方面的差异 3.3 原始类型线程安全前面提到了线程安全设计,那原始数据类型操作是不是线程安全的呢? 这里可能存在着不同层面的问题:
3.4 Java原始数据类型和引用类型局限性从Java平台发展的角度来看看,原始数据类型、对象的局限性和演进 对于Java应用开发者,设计复杂而灵活的类型系统似乎已经习以为常。但是毕竟这种类型系统的设计是源于很多年前的技术决定,现在已经逐渐暴露出了一些副作用,例如:
这是因为Java的泛型某种程度上可以算作伪泛型,它完全是一种编译器的技巧,Java编译器会自动将类型转换为对应的特定类型,这就决定了使用泛型必须保证相应类型可以转换为Object
例如vector和tuple Java为对象内建了各种多态、线程安全等方面的支持,但这不是所有场合的需求,尤其是数据处理重要性日益提高,更加高密度的值类型是非常现实的需求 综上,梳理了原始数据类型及其包装类,从源码级别分析了缓存机制等设计和实现细节,并且针对构建极致性能的场景,分析了一些可以借鉴的实践 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/23 13:31:22- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |