Java int和integer的区别竟然是这样的!

先看再点赞,给自己一点思考的时间,如果对自己有帮助,关注这个执着的职场程序员。

小编导读

面试官:我来问一下基础知识,开发中往往最基础的,最容易忽略的,才是最常用的技能,也是必须掌握的。

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

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

好了,我们开始今天的知识点,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了。
 

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


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

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

我是【尔东双月】一枚执着的职场程序员,文章对你有用就关注我,微信搜索:【程序职场】。别忘了三连啊,点赞、收藏、留言,随意给,我不挑。
注:如果文章有任何问题,欢迎毫不留情地指正。

猜你喜欢

转载自blog.csdn.net/jianpengxuexikaifa/article/details/108487200
今日推荐