八股文-基础知识-int和Integer有什么区别?

引言

在Java编程实践中,基本数据类型int与包装类Integer扮演着不可或缺的角色,它们间的转换与使用策略深刻影响着程序的性能与内存效率。本文旨在深入探究int与Integer的区别,涵盖其在内存占用、线程安全、自动装箱与拆箱机制等方面的表现。重点探讨Integer类中独特的值缓存策略,该策略在-128至127范围内自动缓存Integer对象,显著提升程序运行速度,减少内存开销。同时,分析Java不同版本对字符串操作的底层优化,包括JDK 9引入的Compact Strings以及JVM层面的Intrinsic机制,以及在面对性能瓶颈时,如何合理选择原始数据类型与包装类以优化代码执行效能。通过细致解读源码,我们得以洞悉Java设计者对基础类型封装背后的设计考量与实际应用场景,从而启发开发者在日常编码中做出更具针对性和高效的选择。

题目

int 和 Integer 有什么区别?

典型回答

int 是Java的原始数据类型(Primitive Type),它代表一个整数值,直接存储在内存栈中,占用固定大小的内存空间,不涉及对象的创建和销毁,效率高且内存占用小。
而 Integer 是 int 的包装类,它位于 Java 的对象层次,存储在堆内存中,每个 Integer 实例都包含一个 int 类型的字段用于存储值,并提供了一系列对象方法,如数学运算、字符串转换等。Integer 对象可以被赋予 null 值,这是原始类型 int 所不具备的。
Integer 引入了自动装箱和拆箱机制,使得它在与对象交互时更为方便。此外,Integer 提供了缓存机制,默认情况下-128到127之间的值会被缓存,重复请求时直接返回缓存对象,以提升性能。
在性能敏感场景下,直接使用 int 类型可以避免装箱和拆箱带来的额外开销。而在需要对象功能(如集合操作、线程间传递)时,Integer 更为适用。同时,Integer 类内部实现不可变,确保了线程安全和缓存的有效性。

加分项

自动装箱、拆箱

自动装箱和拆箱是Java语言的一种特性,它允许原始数据类型(如int)与对应的包装类(如Integer)之间无缝转换,无需手动实例化或强制类型转换。
自动装箱是指将原始数据类型自动转换为其对应的包装类对象的过程。例如,当你需要将一个int型变量放入需要对象类型的集合(如ArrayList)中时,Java会自动将int转换为Integer对象。

Java
1int i = 10;
2List<Integer> list = new ArrayList<>();
3list.add(i); // 自动装箱,将int转换为Integer对象放入列表

自动拆箱则是相反的过程,即自动将包装类对象转换为原始数据类型。如下例所示:

Java
1Integer objInt = new Integer(20);
2int j = objInt; // 自动拆箱,将Integer对象转换为int类型赋值给变量

值得注意的是,自动装箱和拆箱操作发生在编译阶段,Java编译器会将相应的操作转换为对包装类的valueOf()方法(装箱)和intValue()方法(拆箱)的调用。同时,Java对部分范围内的Integer对象(如-128到127)实施了缓存策略,通过valueOf()方法创建这些范围内的Integer对象时,会直接从缓存中获取,从而提高性能。
除了Integer之外,Java语言的自动装箱和拆箱机制同样适用于其他七个原始数据类型的包装类:

  1. Boolean: 自动装箱会将布尔类型 truefalse 转换成 Boolean.TRUEBoolean.FALSE 对象,这两个实例在Java中被静态缓存,确保每次装箱都会复用同一对象。自动拆箱则是将 Boolean 对象转换回 boolean 类型的值。
  2. Byte: 当 byte 类型的数据被赋给 Byte 引用时,会发生自动装箱。而在 Byte 对象被赋给 byte 类型变量时,自动拆箱生效。Byte类也采用了缓存机制,对于所有的 byte 可能值,均会被缓存起来。
  3. Short: Short 类型也有类似的缓存策略,对于 -128 到 127 的 short 值,通过 Short.valueOf() 创建的 Short 对象会复用同一个实例。
  4. Character: Character 类型的缓存范围是 ‘\u0000’ 到 ‘\u007F’,在这个范围内的字符装箱后也会得到相同的 Character 实例。
  5. Long: Long 类型虽然默认没有像上述几个小整数类型那样的缓存机制,但在必要时也可以通过 JVM 参数 -XX:AutoBoxCacheMax=N 设置缓存范围。
  6. Float: Float 类型支持自动装箱和拆箱,但不带有预设的缓存机制。
  7. Double: 同样,Double 类型也支持自动装箱和拆箱,也没有内置的缓存机制。
自动装箱和拆箱需要注意什么问题?

在Java编程中使用自动装箱和拆箱功能时,有几个关键点需要注意:

  1. 性能考量:自动装箱会创建对象,对于频繁的装箱操作,尤其是超出包装类默认缓存范围的数值,会增加内存分配和垃圾回收的压力。相比之下,原始数据类型的操作更轻量级。因此,在性能敏感的场景下,避免不必要的装箱和拆箱操作,改用原始数据类型可以显著提高效率。
  2. 内存占用:包装类对象相比原始数据类型占用更多的内存,因为每个对象都包含对象头信息。在大量数据处理时,这可能导致显著的内存消耗增长。
  3. 类型转换异常:自动拆箱过程中,如果包装类对象为 null,尝试将其转换为原始类型时会抛出 NullPointerException。因此,在进行自动拆箱之前,最好先检查对象是否为 null
  4. 不可变性:包装类如 IntegerBoolean 等是不可变的,一旦创建,其值就不能更改。这意味着,如果在多线程环境下共享这些对象,不需要担心数据竞争问题,但同时也不能通过修改对象来改变其值。
  5. 泛型兼容性:原始数据类型不能直接用于泛型,因此在使用泛型时必须使用包装类。这会间接导致装箱和拆箱操作,需要注意性能影响。
  6. 缓存机制利用:了解包装类的默认缓存范围(例如 Integer 的缓存范围是 -128 到 127),并在可能的情况下利用这一特性,可以减少对象创建。
  7. 代码可读性:虽然自动装箱和拆箱简化了代码,但过度使用可能导致代码逻辑不够直观,特别是对于不熟悉该特性的维护人员。适度的注释和清晰的命名可以帮助提高代码可读性。
  8. 平台和版本差异:虽然Java平台提供了跨平台的一致性,但不同版本的Java可能在自动装箱和拆箱的实现细节上有微小差异,特别是涉及到新的语言特性时,需要关注官方文档以了解最新情况。
源码分析:
  1. 缓存机制的引入
    1. 在Java 5中,引入了自动装箱和拆箱的特性,同时也引入了Integer类的值缓存机制。这个机制通过静态工厂方法valueOf(int i)来实现,以复用Integer对象,减少频繁创建新对象的性能开销。
  2. 默认缓存范围
    1. Integer类默认缓存了从-128到127的Integer对象。这意味着在这个范围内的任何Integer值,通过valueOf方法获取的都将是相同的对象实例。
  3. 缓存上限的调整
    1. 通过JVM的启动参数-XX:AutoBoxCacheMax=N,开发者可以根据需要调整Integer缓存的上限值。这个参数设置会影响缓存中可以存储的最大整数值。
  4. 源码中的缓存实现
    1. 在java.lang.Integer源码中,缓存的实现是通过内部类IntegerCache来完成的。这个类负责维护缓存的逻辑,包括缓存对象的创建和复用。
  5. 不可变类型的声明
    1. Integer类中存储整数值的字段被声明为private final,这确保了一旦Integer对象被创建,它的值就不能被改变,从而保证了对象的不可变性。
  6. 安全性和线程安全
    1. 不可变对象天然是线程安全的,因为它们的状态在创建后不能被更改。这对于多线程环境中的数据共享非常有用。
  7. 类和常量的定义
    1. Integer类定义了一些常量,如MAX_VALUE、MIN_VALUE、SIZE(表示int类型的大小,单位为位),这些常量在类加载时就被确定下来。
  8. 跨平台的一致性
    1. Java的设计保证了原始数据类型的大小在不同操作系统和不同架构的JVM上是一致的。这意味着开发者在进行平台迁移时,不需要担心数据类型的位数问题。
  9. Java类型系统的局限性
    1. 原始数据类型和Java泛型系统存在局限性,例如原始数据类型不能直接作为泛型的类型参数。
  10. Valhalla项目
  11. Valhalla项目是OpenJDK的一个倡议,旨在改进Java的类型系统,包括引入值类型和更高效的数据结构。

其它

关注公众号【 java程序猿技术】获取八股文系列文章

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

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

相关文章

tomato靶场

扫描网址端口 访问一下8888 我们用kali扫描一下目录 访问这个目录 产看iofo.php源码&#xff0c;发现里面有文件包含漏洞 访问/etc/passwd/发现确实有文件包含漏洞 远程连接2211端口 利用报错&#xff0c;向日志文件注入木马&#xff0c;利用文件包含漏洞访问日志文件 http:/…

嵌入式Linux系统中LCD屏驱动框架基本实现

大家好,今天主要给大家分享一下,如何使用linux系统中LCD屏驱动框架Framebuffer编写具体的代码。 第一:如何编写字符设备驱动程序 1、驱动框架基本操作: 驱动主设备号 * 构造file_operations结构体,填充open/read/write等成员函数 * 注册驱动:register_chrdev(major, name…

【参会邀请】第四届区块链技术与信息安全国际会议(ICBCTIS 2024)诚邀相聚江城!

我们诚挚地邀请您参与第四届区块链技术与信息安全国际会议&#xff08;ICBCTIS 2024&#xff09;。本届会议将于2024年8月17日~19日在中国武汉召开。会议将围绕区块链技术与信息安全等相关研究领域&#xff0c;特邀国内外数位在此领域学术卓越的学者专家做相关致辞与报告&#…

模式植物构建orgDb数据库 | 以org.Slycompersicum.eg.db为例

原文链接:模式植物构建orgDb数据库 | 以org.Slycompersicum.eg.db为例 本期教程 一步构建模式植物OrgDb数据库 source("../Set_OrgDb_Database.R")# 使用函数 Set_OrgDb_Database(emapper_file "out.emapper_tomato.csv", ## 输入的eggnog结果文件json_…

红酒与季节:品味四季的风情

四季轮转&#xff0c;岁月更迭&#xff0c;每个季节都有其不同的韵味与风情。当定制红酒洒派红酒&#xff08;Bold & Generous&#xff09;与四季相遇&#xff0c;它们共同编织出一幅幅美丽的味觉画卷&#xff0c;让我们在品味中感受四季的风情。 一、春之序曲&#xff1a…

学会这个Python库,接口测试so easy

前言 我们在做接口测试时&#xff0c;大多数返回的都是json属性&#xff0c;我们需要通过接口返回的json提取出来对应的值&#xff0c;然后进行做断言或者提取想要的值供下一个接口进行使用。 但是如果返回的json数据嵌套了很多层&#xff0c;通过查找需要的词&#xff0c;就…

MySql Linux 安装

下载 下载后的文件为&#xff1a;mysql-8.4.2-linux-glibc2.28-x86_64.tar.xz 创建用户和用户组 $> groupadd mysql $> useradd -r -g mysql -s /bin/false mysql由于用户仅用于所有权目的&#xff0c;而不是登录目的&#xff0c;因此useradd命令使用 -r和-s /bin/false…

临床数据科学中有关试验设计的四个关键要素

临床数据科学是现代医学研究中不可或缺的组成部分&#xff0c;通过科学的方法和统计分析工具来揭示医疗数据背后的规律和真相。试验设计是临床数据科学的核心环节&#xff0c;直接关系到研究结果的可靠性和科学性。 在过去几十年中&#xff0c;随机临床试验&#xff08;Randomi…

《LeetCode热题100》---<5.③普通数组篇五道>

本篇博客讲解LeetCode热题100道普通数组篇中的五道题 第五道&#xff1a;缺失的第一个正数&#xff08;困难&#xff09; 第五道&#xff1a;缺失的第一个正数&#xff08;困难&#xff09; 方法一&#xff1a;将数组视为哈希表 class Solution {public int firstMissingPosi…

Python——记录pip问题(解决下载慢、升级失败问题)

在python开发中&#xff0c;经常需要使用到各种各样的库。 pip又是我们常用的安装工具。但是国外的源下载速度实在太慢&#xff0c;经常导致超时。 有很多朋友刚刚学Python的时候&#xff0c;会来问为什么pip下载东西这么慢啊&#xff1f; 而且pycharm里面下载库也是非常的慢…

充电宝有必要买贵的吗?充电宝可以带上高铁吗?充电宝选购方法

市面上的充电宝可以说是非常的多&#xff0c;但是能选到一款适合自己的充电宝基本是不容易的&#xff0c;然而&#xff0c;当我们准备选购充电宝时&#xff0c;常常会面临诸多疑问。其中&#xff0c;“充电宝有必要买贵的吗”就是一个备受关注的问题。价格似乎成为了我们在众多…

pytorch学习笔记4 tensor变换

View/reshape viewreshape, 新版本 要保证数据总量不变&#xff0c;否则报错Squeeze/unsqueeze 减少维度和增加维度 unsqueeze(n): 如果n是正&#xff0c;在第n位前面插1维&#xff08;size1&#xff09;&#xff0c; 如果n是负&#xff0c;在倒数第|n|位后面插入1维&#xf…

将 HuggingFace 模型转换为 GGUF 及使用 ollama 运行 —— 以 Qwen2-0.5B 为例

前言 最近&#xff0c;阿里发布了Qwen2的系列模型&#xff0c;包括0.5B, 1.5B, 7B, 57B-A14B 和 72B&#xff0c;中英文效果都很好。 因为模型太新&#xff0c;目前还没有 GGUF 版本可以下载&#xff0c;于是转下GGUF&#xff0c;并分享转换教程。 什么是 GGUF&#xff1f; …

Linux进程间通信学习2

文章目录 共享内存信号信号概述以及种类信号的处理信号相关函数&#xff08;简单&#xff09;运用小demo实现ctrlc无法终止进程使用kill函数在程序内部实现一个进程杀死另外一个进程 信号相关函数高级版运用函数小demo 信号量信号量相关函数运用小demo: 共享内存 相比于前三个…

快速排序(下)

快速排序&#xff08;下&#xff09; 前言 在上一篇文章中我们了解了快速排序算法&#xff0c;但那是Hoare的版本&#xff0c;其实还有别的版本&#xff1a;一种是挖坑法&#xff0c;它们的区别主要在于如何找基准值。霍尔的版本思路难理解但代码好理解&#xff0c;挖坑法则是…

【Qt开发】调试log日志QDebug重定向输出到textEdit等控件(qInstallMessageHandler回调函数)

【Qt开发】调试log日志QDebug重定向输出到textEdit等控件&#xff08;qInstallMessageHandler回调函数&#xff09; 文章目录 Log输出方式qInstallMessageHandler回调函数线程安全textEdit控件附录&#xff1a;C语言到C的入门知识点&#xff08;主要适用于C语言精通到Qt的C开发…

MySQL:数据类型表的基础操作

目录 1、数据类型 1.1 数值类型 1.2 字符串类型 1.3 日期类型 2、表的基础操作 2.1 选择数据库 2.2 建表 2.3 查看库中所有表 2.4 查看某一表结构 2.5 删表 3、可视化编辑工具 3.1 运行 1、数据类型 1.1 数值类型 bit类型可指定长度&#xff08;如果不写&#xff0c;…

实验八: 彩色图像处理

目录 一、实验目的 二、实验原理 1. 常见彩色图像格式 2. 伪彩色图像 3. 彩色图像滤波 三、实验内容 四、源程序和结果 (1) 主程序(matlab (2) 函数FalseRgbTransf (3) 函数hsi2rgb (4) 函数rgb2hsi (5) 函数GrayscaleFilter (6) 函数RgbFilter 五、结果分析 1. …

清华和字节联合推出的视频理解大模型video-SALMONN(ICML 2024)

video-SALMONN: Speech-Enhanced Audio-Visual Large Language Models 论文信息 paper&#xff1a;https://arxiv.org/abs/2406.15704 code&#xff1a;https://github.com/bytedance/SALMONN/ AI也会「刷抖音」&#xff01;清华领衔发布短视频全模态理解新模型 | ICML 2024 …

基于单片机的防火防盗报警系统设计

摘要&#xff1a; 该多功能防火防盗系统既具有根据环境温度和烟雾浓度进行火灾检测的功能&#xff0c;也有能对人体检测实现防盗的功能。多功能智能防火防盗控制系统的主控制器是 STC89C52 单片机&#xff0c;环境温度的检测采用 DS18B20 &#xff0c; MQ2 检测烟雾浓度&…