作者:mobiledu2502909783 | 来源:互联网 | 2023-05-17 10:15
好程序员Java
培训分享int
和
Integer
的区别,
在说int
和
Integer
的区别之前,先要弄清楚两个问题:
一、Java基本数据类型及其封装类
二、Java自动拆箱和自动装箱
Java自动拆箱和自动装箱
1
、自动装箱
自动装箱其实就是将基本数据类型转换为引用数据类型(对象)
2
、自动拆箱
自动拆箱其实就是将引用数据类型转化为基本数据类型
int
和
Integer
的区别
分析
int
Integer
int
与
Integer
的区别
相同值下的 int
和
Integer
的比较结果
分析
int
int
是Java的基本数据类型。
Integer
Integer
继承了
Object
类,是对象类型,是
int
的包装类。
int
与
Integer
的区别
值的存储
int
存储在栈中
Integer
对象的引用存储在栈空间中,对象的数据存储在堆空间中。
初始化
int
初始化值为
0
。
Integer
初始化值为
null
。
传参
int
是值传递,栈中的数据不可变。
Integer
对象是引用传递,引用不可变,但是引用指向的堆空间地址中的值是可以改变的。
泛型支持
泛型不支持int
,但是支持
Integer
。
运算
int
可以直接做运算,是类的特性。
Integer
的对象可以调用该类的方法,但是在拆箱之前不能进行运算,需要转化为基本类型
int
。
int
是基本数据类型,
Integer
是引用数据类型;
int
默认值是
0
,
Integer
默认值是
null
;
int
类型直接存储数值,
Integer
需要实例化对象,指向对象的地址。
相同值下的 int
和
Integer
的比较结果
两个通过new
生成的变量,结果为
false
。
int
和
Integer
的值比较,若两者的值相等,则为
true
。
(注意:在比较时,Integer
会自动拆箱为
int
类型,然后再做比较。)
new
生成的
Integer
变量 和 非
new
生成的
Integer
变量比较,,结果为
false
。
(注意:new
生成的
Integer
变量的值在堆空间中,非
new
生成的
Integer
变量的值在在常量池中。)
(注意:非new
生成的
Integer
变量,会先判断常量池中是否有该对象,若有则共享,若无则在常量池中放入该对象;也叫享元模式,后面再说。)
两个非new
生成的
Integer
对象比较,则结果为
true
。
(注意:此处需要一个前提:值的范围在 -128 ~ 127
之间。
涉及到Java
对 int
与
Integer
的自动装箱和拆箱的一种模式:享元模式—
flyweight
,为了加强对简单数字的重复利用。
在赋值时,其实是执行了Integer
的
valueOf()
方法。
当值在 -128 ~ 127
之间时,Java
会进行自动装箱,然后会对值进行缓存,如果下次再有相同的值,会直接在缓存中取出使用。缓存是通过Integer
的内部类
IntegerCache
来完成的。
当值超出此范围,会在堆中new
出一个对象来存储。
PS
:自动装箱与拆箱是在
JDK1.5
中出现的。
)
内部类IntegerCache
通过此类可以缓存简单数字。
缓存的数大小可以由 -XX
:
AutoBoxCacheMax =
控制。
jvm
初始化时,Java.lang.Integer.IntegerCache.high
属性可以设置并保存在私有系统属性中。
规定了low
属性的值:
-128
来看个例子
1
:
a == b
吗? 废话,肯定不相等。两个
new
出来的对象地址不一样。
2
:
c == d
吗? 这个也是废话,都是基本数据类型的值肯定相等。
3
:现在的关键问题是
e == f
吗?
g == h
吗?
答案是:e == f; g != h
。为什么会出现这种情况
?
因为
ava
在进行编译时
Integer g = 130
会被编译成
Integer.valueOf(130)
,这个可以通过反编译
class
文件看到。而通过
Integer
源码可以得出,
Integer.valueOf()
方法会在数值
-128~127
之间会对
Integer
进行缓存,不会再重新
new
一个,所以
e==f
;当数值二大于
127
或者小于
-128
的时候则会重新
new
一个,所以
g != h
。
Integer
的
valueOf
方法如下
4
:
c == e
吗,
i == j
吗?
答案都是相等的。因为封装类和基本数据类型进行比较的时候,Java
会自动拆箱,然后比较数值是
否相等。
综上,我们可以得出几个结论:
1
、都是封装类,都是
new
出来的,肯定不相等。因为对象的内存地址不一样。
2
、都是封装类,都不是
new
出来的,如果值在
-128~127
之间,那就相等,否则不相等。
3
、如果是封装类和基本类型进行比较,只要数值相等那就相等,否则就不相等。因为封装类和基本数据类型进行比较的时候会有一个自动拆箱操作。
4
、都是基本数据类型,如果数值相等,那就相等;否则不相等。