日期:2014-05-20  浏览次数:20764 次

Integer和 String 也一样在栈中?
想问大家一个问题:
当我 每每: Integer integer01 = new Integer(1);的时候,这当然不会缓存,因为每 new 一次都会在堆中生成一个新的对象。

然后我想问的是,如果我 :Integer integer02 = Integer.valueOf(1);
的时候,是不是也想 String 一样,将 值保存在栈中池?
------解决方案--------------------
栈 和 java栈 不是一个东西
堆 和 java堆 也不是一个东西
java栈中的内容是栈帧,栈帧中还有一个操作数栈

每个启动一个java线程就会关联一个java栈,每调用一个java方法就会将一个栈帧入栈

楼主你说的栈究竟是指哪一个?
------解决方案--------------------
引用:
Integer integer02 = Integer.valueOf(1);
的时候,是不是也想 String 一样,将 值保存在栈中池?


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"),原理是一样的,都会和常量池打交道的。先在常量池找一遍,找到了直接指向;没找到就在常量池创建一个。
------解决方案--------------------
引用:
引用:Integer integer02 = Integer.valueOf(1);
的时候,是不是也想 String 一样,将 值保存在栈中池?

Integer.valueOf(i)和new Integer(i)几乎是一样的,只是-128到127可以直接读取缓存,这样效率高一些。
具体可以参考Integer.valueOf的……


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个数字的数组
------解决方案--------------------
引用:
IntegerCache是在vm启动的时候,就分配好了的吗? 

应该是在jvm启动时  就分在了  永久代里面了