- Java中,数值型的创建和字符串有类似的地方,Integer是Java为了使用对象的属性和方法给int准备的类型。字符串 String s = “bag”; 这样创建会在常量池中查找 bag,没有的话就新建,并不会在堆里新建。
- 同样地,Integer i = 11;也不会在堆里面新建,最多在数字常量池新建。
- Java为了提高效率,把一些最常用的数值放到了“数字常量池”,不超过这个范围的数字都会把引用指向常量池。这个数字常量池的范围-128~127,超过这个范围就会去堆。下面的代码会说明这个:
public class Demo {
public static void main(String[] arg) {
int a = 10;
int b = 10;
Integer A = 10;
Integer B = 10;
Integer C = new Integer(10);
Integer D = new Integer(10);
Integer E = 128;
Integer F = 128;
System.out.println(a == b);
System.out.println(A == B);
System.out.println(C == D);
System.out.println(A == C);
System.out.println(a == C );
System.out.println(a == A);
System.out.println(E == F);
}
}
运行结果:
true //基本数据类型,在栈中指向同一个值
true //和字符串一样,指向常量池的同一个值,不在堆中新建
false //new了两个integer的对象,两个内存地址不一致。这里要注意的是 == 的意思。
false //同上
true //涉及 int 和 integer,C 自动拆箱,然后和a进行比较
true //自动拆箱
false //这个就是文章一开始所说的 “常量池溢出”(我编的),即常量池没有这个玩意儿。。。