当前位置: 代码迷 >> J2SE >> 关于java中Int等部类装箱时发生的奇怪现象
  详细解决方案

关于java中Int等部类装箱时发生的奇怪现象

热度:96   发布时间:2016-04-23 20:08:18.0
关于java中Int等类型装箱时发生的奇怪现象
本帖最后由 sinat_15190837 于 2014-11-20 22:39:23 编辑
下面我总结下我的理解,各位看看是否正确:
1. int,byte,short这几个基本类型变量的装箱操作,底层都有一个缓冲池(java源码可以找到实现),也就是Object a=200; 这样的操作,就会创建一个新对象装下200,因为200超出了缓冲池。所以每次装箱都new新的对象来包装200.因此:
Object a=200;与Object b=200;    其a和b不是指向同一个对象。
而Object a =100与Object b=100 其a和b是同一个对象。(由于缓存池机制,导致装箱的时候,只取一个值为100的对象返回,所以a和b地址相同)


同时,装箱的东西有个不可变的特性(就像String类的对象也具有不可变的性质)。因此每次改变某个对象的值,都是去创建一个新的对象。例如:
Object a=200;
Object b=a; 
b=201;
在第二行,a和b是指向同一个对象,但是第三行修改b对象的时候,由于b对象的不可修改特性,导致最后结果是b是指向一个201的新对象,a还是指向200的那个对象。 也就是说装箱后的基本类型不能再次被改变,只能创建新对象。

2. 以上的缓冲池和不可变性适用于String对象。(虽然String没有装箱,但是有创建对象的情况)


Object a=122;
Object b=a; 
b=122;
由于缓存池存在,导致a和b还是指向一个122对象。是吧
------解决思路----------------------
说的对,字符串的话是有一个常量池。
------解决思路----------------------
int 
assert IntegerCache.high >= 127;
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
-128 ~ 127 在缓存池中,超范围的new

char 的缓冲,小于127的
public static Character valueOf(char c) {
        if (c <= 127) { // must cache
            return CharacterCache.cache[(int)c];
        }
        return new Character(c);
    }

short  -128 ~ 127 缓存
public static Short valueOf(short s) {
        final int offset = 128;
        int sAsInt = s;
        if (sAsInt >= -128 && sAsInt <= 127) { // must cache
            return ShortCache.cache[sAsInt + offset];
        }
        return new Short(s);
    }
  相关解决方案