Integer的自动拆装箱的陷阱(整型…
2017-10-13 16:40
295 查看
package integer;
public class IntegerTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer a1 = 127, a2 = 127, b1 = 128, b2 = 128;
System.out.println(a1==a2);
System.out.println(a1.equals(a2));
System.out.println(b1==b2);
System.out.println(b1.equals(b2));
}
}
true
true
false
true
引用回答
JVM会自动维护八种基本类型的常量池,int常量池中初始化-128~127的范围,所以当为Integer
i=127时,在自动装箱过程中是取自常量池中的数值,而当Integer
i=128时,128不在常量池范围内,所以在自动装箱过程中需new
128,所以地址不一样。
以上是靠整型数的自动拆装箱实现的,而两者的结果却不相同。
原因在于,在进行自动拆装箱时,编译器会使用Integer.valueof()来创建Integer实例。
2、以下是Integer.valueof()的源代码:
[java] view
plain copy
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
简单地解释这段代码,就是如果传入的int在IntegerCache.low和IntegerCache.high之间,那就尝试看前面的缓存中有没有打过包的相同的值,如果有就直接返回,否则就创建一个Integer实例。IntegerCache.low
默认是-128;IntegerCache.high默认是127.
注:如果要比较两个对象的内容是否相同,尽量不使用== 或者!= 来比较,可以使用equal()来实现。
public class IntegerTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
Integer a1 = 127, a2 = 127, b1 = 128, b2 = 128;
System.out.println(a1==a2);
System.out.println(a1.equals(a2));
System.out.println(b1==b2);
System.out.println(b1.equals(b2));
}
}
true
true
false
true
引用回答
JVM会自动维护八种基本类型的常量池,int常量池中初始化-128~127的范围,所以当为Integer
i=127时,在自动装箱过程中是取自常量池中的数值,而当Integer
i=128时,128不在常量池范围内,所以在自动装箱过程中需new
128,所以地址不一样。
以上是靠整型数的自动拆装箱实现的,而两者的结果却不相同。
原因在于,在进行自动拆装箱时,编译器会使用Integer.valueof()来创建Integer实例。
2、以下是Integer.valueof()的源代码:
[java] view
plain copy
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
简单地解释这段代码,就是如果传入的int在IntegerCache.low和IntegerCache.high之间,那就尝试看前面的缓存中有没有打过包的相同的值,如果有就直接返回,否则就创建一个Integer实例。IntegerCache.low
默认是-128;IntegerCache.high默认是127.
注:如果要比较两个对象的内容是否相同,尽量不使用== 或者!= 来比较,可以使用equal()来实现。
相关文章推荐
- Integer的自动拆装箱的陷阱(整型数-128到127的值比较问题)
- Integer的自动拆装箱的陷阱(整型数-128到127的值比较问题)
- Integer的自动拆装箱的陷阱(整型数-128到127的值比较问题)
- Integer的自动拆装箱的陷阱(整型数-128到127的值比较问题)
- Integer的自动拆箱和自动装箱的陷阱(整型数-128到127的值比较问题)
- Integer的自动拆装箱的陷阱
- Integer的自动拆装箱的陷阱
- Integer的自动拆装箱的陷阱
- Integer的自动拆装箱问题
- Integer的缓存和自动拆装箱
- Integer的自动拆箱装箱陷阱
- Integer的自动拆装箱 导致 == 比较出现错误
- JAVA面试系列(一)int和Integer相关的自动拆装箱
- Java自动拆装箱简单介绍
- java 自动装箱与拆箱 中的陷阱
- Integer包装器,自动装箱的机制和时机。
- 关于自动装箱 与自动 和自动拆箱。Integer,Boolean等
- integer自动装箱拆箱&String内存分配测试
- 记int自动装箱为Integer实例时出现的问题
- int自动封装Integer的小知识(转载)