在说int和Integer的区别之前,必须弄清楚两个问题。
一、java基本数据类型及其封装类
二、java自动开箱和自动装箱
java自动开箱和自动装箱
1、自动装箱是将基本数据类型转换为参照数据类型(对象),自动装箱是转换为基本数据类型int和Integer的区别
分析Integerint和integerint不同值相同的int和integer的比较结果
分析
intint是java的基本数据类型。
整合者
Integer继承Object类,是对象类型,是int的包类。
int和Integer的区别
存储值
int存储在堆栈中
对Integer对象的引用存储在堆栈区域中,而对象的数据存储在堆区域中。
初始化
int初始化值为0。
整数初始化值为空。
传达参考
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之间。
享受源模式—flyweight是基于java的int和Integer自动装箱和开箱模式之一,是为了加强简单数字的重用。
赋值时,实际上执行的是Integer的valueOf ()方法。
如果值在- 128到127之间,java会自动装箱并缓存值。 其次,如果有相同的值,则直接从缓存中取出后使用。 缓存由Integer的内部类IntegerCache进行。
如果超过该范围,对象将保存到堆中的new中。
PS :自动打包和开箱是在JDK1.5中进行的。
)
内部类集成缓存
这样做可以缓存简单的数字。
缓存数量的大小可以由-XX:AutoBoxCacheMax=控制。
初始化jvm时,可以将Java.lang.integer.integer cache.high属性设置为专用系统属性并进行保存。
规定了low属性的值:-128
让我们来看一个例子
1:a==b吗? 胡说,一定不相等。 出现2个new的对方地址不同。
2:c==d吗? 这也是无稽之谈,都是基本数据类型的值一定相等。
3 )现在的关键问题是e==f吗? 是g==h吗?
答案是e==f; g!=h 为什么会发生这种事? 由于在编译时将Integer g=130编译为integer.valueof(130 ),因此可以通过反编译class文件来查看ava。 由Integer源代码可知,Integer.valueOf ) )方法在数值-128~127之间缓存Integer,不再是new,因此e==f; 如果数值2大于127或小于-128,则需要再加一个新值,因此g!=h
整数的值方法如下
4 ) c==e还是i==j?
答案是一样的。 因为在比较封装类和基本数据类型时,java会自动打开箱子,比较数值是否相等。
综上所述,可以得出一些结论。
1、都是套装系,都是从new出来的,所以肯定不相等。 因为对象的内存地址不同。
2、都是包装系,并不是出了new。 如果值在- 128到127之间,则等于,否则不等于。
3、在比较包装类和基本类型时,如果数值相等,则其相等,否则不相等。 因为如果将封装的类与基本的数据类型进行比较,就会有自动开箱操作。
4、都是基本数据类型,数值相等则不相等。
新课在29.9元的期限内优惠到10元