面试官:解释一下Java的int和integer的区别,就算面试通过!

161 阅读5分钟

有情怀,有干货,微信搜索【程序员漫话编程】关注这个技术控程序员。
本文 GitHub github.com/ProceduralZ… 已收录,有一线大厂面试完整考点、资料以及我的系列文章。

上次说到我面试字节的事情,今天说的就是有关面试中的一道题,其实在面试字节中我发现这些大厂非常重视一些基础的细节问题。

所以为了能帮助更多的人,我会一个一个全部输出。

好了,我们开始今天的知识点,int和integer的比较,我相信大部分人看到会说这个是一样的啊。一样不一样你继续往下看,我相信看完这篇文章绝对让你一下之全明白。

1,概念

概念在这里主要讲他们是什么?

int是基本数据类型,int变量存储的是数值。
Integer是引用类型,实际是一个对象,Integer存储的是引用对象的地址。

2,Java基本数据类型及其封装类

为什么我们要说基本数据类型和封装类呢?因为int和Integer的关系就是基本数据类型和封装类的关系。

我们接着往下看,都有哪些基本数据类型和封装类?

数据类型

字节大小

封装类

byte

8位

Byte

short

16位

Short

int

32位

Interger

long

64位

Long

float

32位

Float

double

64位

Double

boolean

1位

Boolean

看到这个类型图了吗?int的封装类就是Interger。

Java数据类型有基本数据类型和引用数据类型,为了方便将基本数据类型当作对象处理,Java引入了基本数据类型相对应的封装类,如int封装类是Integer。

3**,Int和Interger的相互转换**

两者之前的相互转换 其实还有一个更官方的名称叫:**自动拆箱和自动装箱

我们先来说一下拆箱和装箱的概念吧!**

1、自动装箱 自动装箱其实就是将基本数据类型转换为引用数据类型(对象)
2、自动拆箱 自动拆箱其实就是将引用数据类型转化为基本数据类型

看完概念肯定基本明白了,就是相互转化的过程。如果你还是不明白,那你继续往下看代码,来一个实找,搞定它。
​​​​​

public static void main(String[] args) {
 Integer a = 1;//这里就用到了自动装箱;等同于Integer a = new Integer(1);
 int b = a - 1;//对象不能直接进行计算,所以这里有自动拆箱的操作,将a对象转换成基本数据类型,然后-1
  System.out.println(a);
  System.out.println(b);  
}

4,Int和Interger的区别
说了这么多,我来总结一下他们两个的区别,通过区别会更清晰

1,Integer是int的包装类,int则是java的一种基本数据类型
2,Integer变量必须实例化后才能使用,而int变量不需要
3,Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值
4,Integer的默认值是null,int的默认值是0

5,Int和Interger的内存比较****

Integer对象会占用更多的内存。Integer是一个对象,需要存储对象的元数据。
但是int是一个原始类型的数据,所以占用的空间更少

6,Int和Interger的比较实例****

概念最少缺少点事实根据,下面通过几个实例来一个一个的展示说明,让你完全理解,好了 继续往下看吧。

实例1
​​​​​​

Integer i = new Integer(100);
Integer j = new Integer(100);
System.out.print(i == j); //false

分析:两个通过new生成的变量实际上是两个Integer对象的引用,所以两个变量永远是不相等的(因为new生成的是两个对象,是对对象的引用,其内存地址不同)。

实例2

Integer i = new Integer(100);
int j = 100;
System.out.print(i == j); //true

分析:Integer变量和int变量比较时,只要两个变量的值是相等的,则结果为true.
因为包装类Integer和基本数据类型int比较时,Java会自动拆箱为int,然后进行比较,实际上就变为两个int变量的比较

实例3

Integer i = new Integer(100);
Integer j = 100;
System.out.print(i == j); //false

分析:非new生成的Integer变量和new Integer()生成的变量比较时,结果为false。
因为非new生成的Integer变量指向的是Java常量池中的对象,而new Integer()生成的变量指向堆中新建的对象的引用,它们在内存中的地址不同。

实例4

Integer i = 100;
Integer j = 100;
System.out.print(i == j); //true

分析:对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false。

上面的实例明显是值100,在-128到127之间。我来做一个超出这个区间的。
​​​​​​

Integer i = 128;
Integer j = 128;
System.out.print(i == j); //false

这时结果就是false。

Java对于-128到127之间的数会做缓存,当 Integer i = 127时,会将127进行缓存,下次再写Integer j = 127时,就会直接从缓存中取,不需要new了。

我:好了面试官我回答完毕了,你还有什么要说的吗?
面试官:嗯 嗯 没有了,那就下一个问题吧!

好了,今天的这篇文章,虽然短而小,但是很清晰,通俗易懂,能更好,更快的学到这个知识点。

支持我就毫无犹豫的 转发 吧!!!!!!

文章持续更新,可以微信搜一搜「 程序员漫话编程 」第一时间阅读,回复【实战项目】有我准备的一线大厂面试资料和实战项目学习资源。
本文 GitHub github.com/ProceduralZ… 已经收录,有大厂面试完整考点,欢迎Star。