Integer和 String 也一样在栈中?
想问大家一个问题:
当我 每每: Integer integer01 = new Integer(1);的时候,这当然不会缓存,因为每 new 一次都会在堆中生成一个新的对象。
然后我想问的是,如果我 :Integer integer02 = Integer.valueOf(1);
的时候,是不是也想 String 一样,将 值保存在栈中池?
------解决方案--------------------栈 和 java栈 不是一个东西
堆 和 java堆 也不是一个东西
java栈中的内容是栈帧,栈帧中还有一个操作数栈
每个启动一个java线程就会关联一个java栈,每调用一个java方法就会将一个栈帧入栈
楼主你说的栈究竟是指哪一个?
------解决方案--------------------
Integer.valueOf(i)和new Integer(i)几乎是一样的,只是-128到127可以直接读取缓存,这样效率高一些。
具体可以参考Integer.valueOf的源码: (IntegerCache就是一个-128到127的Integer数组)
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);
}
同理,Character等也是有这样的缓存机制。
至于你说的,new Integer(i)和new String("str"),原理是一样的,都会和常量池打交道的。先在常量池找一遍,找到了直接指向;没找到就在常量池创建一个。
------解决方案--------------------
IntegerCache是在vm启动的时候,就分配好了的吗?
------解决方案--------------------
private static class IntegerCache {
private IntegerCache(){}
static final Integer cache[] = new Integer[-(-128) + 127 + 1];
static {
for(int i = 0; i < cache.length; i++)
cache[i] = new Integer(i - 128);
}
}
IntegerCache只是个静态类而已,预先定义了256个数字的数组
------解决方案--------------------
应该是在jvm启动时 就分在了 永久代里面了