public class SEjava {
public static void main(String[] args) {
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1==i2);
System.out.println(i3==i4);
}
}
输出结果:
true
false
原因:
JVM会自动维护八种基本类型的常量池,int常量池中初始化-128~127的范围,所以当为Integer在-128-127时,在自动装箱过程中是取自常量池中的数值;
当Integer取值在常量池范围之内,对JVM为了节省空间, 当Integer的值落在-128~127之间时,JVM首先检查是否已存在值为127的Integer对象。如果是,则直接是引用已存在对象;
当超出常量池取值范围,则每次都会新建对象。Integer类中有一个静态内部类IntegerCache,在IntegerCache类中有一个Integer数组,用以缓存当数值范围为-128~127时的Integer对象。