- Long 是long類型的包裝類型。
- Long默認零值為null, long的默認零值為 0.
- Long類中有個靜態的內部緩存類,用來緩存 -128 ~ 127 之間的long包裝對象實例,類加載的過程中會對LongCache的靜態代碼塊進行初始化,后面自動裝箱的 -128 ~ 127 之間的Long會直接返回緩存數組里面的對象引用。Long i = 125; 會直接指向靜態常量池里面的值。
//1. Long的內部類,當Class字節碼文件被加載的時候,會執行靜態代碼塊,對cache數組進行初始化。 private static class LongCache { private LongCache(){} static final Long cache[] = new Long[-(-128) + 127 + 1]; static { for(int i = 0; i < cache.length; i++) cache[i] = new Long(i - 128); } }
//2. 后面用Long.valueOf(Long l) 方法獲取對應的Long對象的時候,或者直接用“=”給Long類型變量賦值的話,如果緩存數組有,則直接返回緩存數據里的對象引用。
public static Long valueOf(long l) {
final int offset = 128;
if (l >= -128 && l <= 127) { // will cache
return LongCache.cache[(int)l + offset];
}
return new Long(l);
}
//3. 注:如果用 new Long(x) 創建出來的對象始終在堆內存中。
//4. 該特性,int的包裝類型Integer類似。
- Effective java中建議,在循環中不要使用包裝類型,會進行頻繁的裝箱和拆箱動作,嚴重影響性能。
- 注意,long 賦值的時候,需要給數字后面帶“l”;
(復習筆記整理,若有出入后續修繕)