下面我总结下我的理解,各位看看是否正确:
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没有装箱,但是有创建对象的情况)
3
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);
}