面试官问我为什么Integer a = (128) != Integer b (128) 装箱拆箱及IntegerCache问题

news/2024/11/24 2:16:32/

前言

基本数据类型与包装类型:

什么是基本数据类型?什么是包装类型?

装箱拆箱

什么是装箱?什么是拆箱?

怎么进行装箱的?

为什么这样设计?

如何进行拆箱

有了基本数据类型为什么还要有包装类型?

包装类的缓存机制

总结


前言

在面试的时候面试官给我了几行代码如下:

面试官: 下面输出的结果是什么?

我: 第一个 true , 第二个 false;

面试官: 为什么?

我: ???????

public class Demo1 {public static void main(String[] args) {Integer i1 = 127;Integer i2 = 127;Integer i3 = 128;Integer i4 = 128;System.out.println(i1 == i2); // trueSystem.out.println(i3 == i4); // false}
}

 

接下来我们看着源码刨析下这个问题以及该从哪些方面回答。


基本数据类型与包装类型:

什么是基本数据类型?什么是包装类型?

基本数据类型:

java中有八大数据类型:byte、sort、char、int、long、float、double、boolean。

它们默认值分别是:0,0,'_',0,0,0.0,0.0,false.

包装类型:

每一个基本数据类型都对应一个包装类型:

byte - Byte / sort - Sort / char - Character / int - Integer / long - Long / float - Float / double - Double / boolean - Boolean

它们默认值都是: null


装箱拆箱

什么是装箱?什么是拆箱?

装箱是基本数据类型转换成对应的包装类型。(通过 valueOf( ) 方法进行转换)

public class Demo2 {public static void main(String[] args) {Integer i = new Integer(127); // 装箱Integer i1 = Integer.valueOf(127); // 装箱Integer i2 = 127; // 装箱System.out.println("i: " +i.hashCode()); // 127System.out.println("i1: " +i1.hashCode()); //127System.out.println("i3: " + i2.hashCode()); //127System.out.println(i1 == i); // falseSystem.out.println(i == i2); // falseSystem.out.println(i2 == i1); //true}
}

拆箱是包装类型转换成对应的基本数据类型。  (通过 x.xxxValue() 方法进行拆箱)

public class Demo3 {public static void main(String[] args) {Integer it = 127;int i1 = it;int i2 = it.intValue();System.out.println(it == i1); // trueSystem.out.println(it == i2); // trueSystem.out.println(i1 == i2); // true}
}

 

怎么进行装箱的?

一、Integer i1 = new Integer();

我们以 Integer 为例:

 这种装箱方式在堆区开辟空间,所以两个不一样的对象地址不同返回false,没有使用到IntegerCa

che

源码: 直接将 int 值赋值操作并创建对象。

 二、Integer i1 = 127;

为什么第一个输出 true,而第二个输出 false 呢?

看下源码:

我们可以了解到这种方式装箱通过  valueOf的方式进行创建一个 Integer 对象,并使用了一个 IntegerCache 整形缓存来进行了一次比较,这个是什么呢?

我们再查看下源码可知:

IntegerCache 是一个Integer 类型的数组,数值范围再 -128 - 127 之间,如果装箱的数值在这个范围内,直接返回这个对象,否则创建一个新的对象。

为什么这样设计?

设计者认为我们使用的数值大部分是100 以内,为了节省内存资源的消耗,频繁创建对象的性能消耗,所以指定了这个规则。

如何进行拆箱

以 Integer 类型为例:通过 intValue( ) 进行装箱操作

我们看下源码:

 

 

 

 我们可以知道,包装类型底下还是保存一个 int ,并且被 final 修饰保证安全。


有了基本数据类型为什么还要有包装类型?

面试官: 包装类型存在的意义是什么?

我:

java是面向对象的语言,我们操作的一切其实都是对象,比如在集合类中,我们只能操作对象,这时候基本类型就不适用了,对基本类型提供对象类,可以增加对基本类型的操作,实现更多的功能。


包装类的缓存机制

面试官:那可以再解释一下包装类的缓存机制么?

我: 缓存机制是为了节省内存,降低性能消耗的一种方法,在规定的范围内可以直接调用同一对象而不去重新创建。不是所有的包装类型都有缓冲机制如 Byte、short、Integer、Character、Long具有缓存机制,范围都是 -128 - 127。当需要频繁的使用同一对象的时候,如果有缓存,则可以避免重复创建同一对象,节省空间开销和时间消耗,提升了性能。

面试官:50w年薪明天来上班!


总结

面对这个问题的时候,我们先看着代码给出结果,随着面试官的深入,解释为什么会存在包装类型及区别如默认值,及包装类的缓存机制及存在的价值。


http://www.ppmy.cn/news/37401.html

相关文章

【计算机视觉 | 目标检测】DETR风格的目标检测框架解读

文章目录一、前言二、理解2.1 DETR的理解2.2 DETR的细致理解2.2.1 Backbone2.2.2 Transformer encoder2.2.3 Transformer decoder2.2.4 Prediction feed-forward networks (FFNs)2.2.5 Auxiliary decoding losses2.3 更具体的结构2.4 编码器的原理和作用2.5 解码器的原理和作用…

【前端】jQuery

jQuery 是 JavaScript 的一个库,可以简化 JavaScript 编程 点击下载 jQuery 语法 $(selector).action()jquery(selector).action() selector 为选择器,使用选择器选择 HTML 元素 action() 为操作,对选中的元素进行操作 选择器 CSS 选择…

大数据学完好就业么

Python的普及与数据挖掘、人工智能和数值计算等领域的蓬勃发展相关,但同时也与普遍编程需求的增加有关。 Python应用领域广泛,意味着选择Python的同学在学成之后可选择的就业领域有很多,加上Python本身的优势,致使现在越来越多的…

Java Script

一.初识js 1.与css html的关系 HTML 网页的结构(骨CSS:网页的表现(皮JavaScript :网页的行为2.运行过程 编写的代码是保存在文件上,也就是存储到硬盘(外存zhong)双击以后,html文件浏览器(引用程序)就会读取文件,将文件内容加载到内存中,(数据流向:硬盘->内存)浏览器会解析用…

奇异值分解(SVD)和图像压缩

在本文中,我将尝试解释 SVD 背后的数学及其几何意义,还有它在数据科学中的最常见的用法,图像压缩。 奇异值分解是一种常见的线性代数技术,可以将任意形状的矩阵分解成三个部分的乘积:U、S、V。原矩阵A可以表示为&#…

第09章_子查询

第09章_子查询 🏠个人主页:shark-Gao 🧑个人简介:大家好,我是shark-Gao,一个想要与大家共同进步的男人😉😉 🎉目前状况:23届毕业生,目前在某公…

Node.js学习笔记——fs模块

fs全称为file system,称之为文件系统,是Node.js中的内置模块,可以对计算机中的磁盘进行操作。 本章节会介绍如下操作: 文件写入文件读取文件移动与重命名文件删除文件夹操作查看资源状态 一、文件写入 文件写入就是将数据保存…

看文这篇保证你了解掌握【TCP/IP 五层模型】!

1. 协议分层 在网络通信中,需要约定的协议,其实是非常复杂的!面对复杂的环境,就需要复杂的协议,但是太复杂也不好。 协议是拆分很多的,那么就针对有些小的协议,作用或者定位类似的进行分类&…