java里面int和Integer的区别,十个人有九个答不上来

2019年10月07日12:50:09 科技 1907

在说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

来看个例子

java里面int和Integer的区别,十个人有九个答不上来 - 天天要闻

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方法如下

java里面int和Integer的区别,十个人有九个答不上来 - 天天要闻

4:c == e 吗, i == j 吗?

答案都是相等的。因为封装类和基本数据类型进行比较的时候,java会自动拆箱,然后比较数值是 否相等。

综上,我们可以得出几个结论:

1、都是封装类,都是new出来的,肯定不相等。因为对象的内存地址不一样。

2、都是封装类,都不是new出来的,如果值在-128~127之间,那就相等,否则不相等。

3、如果是封装类和基本类型进行比较,只要数值相等那就相等,否则就不相等。因为封装类和基本数据类型进行比较的时候会有一个自动拆箱操作。

4、都是基本数据类型,如果数值相等,那就相等;否则不相等。


新课29.9元限时优惠至10元

科技分类资讯推荐

引领科技豪华MPV新风尚 第二代腾势D9西安车展亮相 - 天天要闻

引领科技豪华MPV新风尚 第二代腾势D9西安车展亮相

兼具宜商气度与家用温情的科技豪华旗舰MPV,第二代腾势D9迎来西安地区正式亮相。新车依托全球新能源MPV冠军底蕴,以第二代刀片电池、双阀云辇-C、天神之眼5.0智驾等核心技术全面升级,兼顾商务体面与家庭舒适,为西北高端用户带来一站式全能出行解决方案。
采购禁入!科华数据材料造假被拒门外 - 天天要闻

采购禁入!科华数据材料造假被拒门外

本报(chinatimes.net.cn)记者胡雅文 北京报道这家赶上AI算力风口的公司,因投标材料造假,被相关采购方列入禁入名单两年,其此前提出的复议申请也被正式驳回。相关采购平台近日发布公告,明确驳回科华数据股份有限公司(下称“科华数据”,002335.SZ)此前提交的复议申请。早在一年前,科华数据已被认定在“信息通信枢纽...
快评乐道L80:15万元级买大五座,这波值得冲? - 天天要闻

快评乐道L80:15万元级买大五座,这波值得冲?

日前,乐道L80正式发布并开启预售,其整车购买预售价为24.58万元起,租电购买预售价则低至15.98万元起。面对大型SUV市场“细分再细分”之竞争趋势,这款乐道年度重磅新车都有哪些优势?又能否成为“大五座SUV革新之作”?下面,圈哥就带大家全方位感受。
成都直击凯威德:纯电全尺寸SUV的张扬与大气 - 天天要闻

成都直击凯威德:纯电全尺寸SUV的张扬与大气

4月22日,凯迪拉克以奥斯卡级盛典规格,将上海保利大剧院点亮为璀璨舞台,在品牌代言人倪妮与全场嘉宾的共同见证下,凯迪拉克全尺寸纯电公路旗舰——凯威德耀然上市。新车共推出长续航四驱Pro、高性能四驱Ultra两款配置,官方售价区间为46.88万-50.88万元。