java常量池技術
java中常量池技術說的通俗點就是java級別的緩存技術,方便快捷的創建一個對象。當需要一個對象時,從池中去獲?。ㄈ绻刂袥]有,就創建一個并放入池中),當下次需要相同變量的時候,不用重新創建,從而節省空間。
java八種基本類型的包裝類和對象池
java中的基本類型的包裝類、其中Byte、Boolean、Short、Character、Integer、Long實現了常量池技術,(除了Boolean,都只對小于128的值才支持)
比如,Integer對象
1
2
3
4
5
6
7
8
9
10
|
Integer i1 = 100 ; Integer i2 = 100 ; // 上面兩行代碼,使用自動裝箱特性,編譯成 // Integer i1 = Integer.valueOf(100); // Integer i2 = Integer.valueOf(100); System.out.println(i1 == i2); Integer i3 = 128 ; Integer i4 = 128 ; System.out.println(i3 == i4); |
執行結果:
1
2
|
true false |
原因我看下Integer對象的valueOf()的源碼
1
2
3
4
5
6
7
8
|
public static Integer valueOf( int i) { assert IntegerCache.high >= 127 ; if (i >= IntegerCache.low && i <= IntegerCache.high) return IntegerCache.cache[i + (-IntegerCache.low)]; // 對于不在這個范圍的就重新創建一個Integer對象 return new Integer(i); } |
對于-128~127的Integer對象才會到IntegerCache里獲取緩存,使用常量池技術。
1
2
|
private static class IntegerCache { ... static final Integer cache[]; // IntegerCache類的cache是用final修飾的,是個靜態數組,起到緩存的作用} |
String類的常量池
String類型的常量池比較特殊,String類常量池在jdk7中放在了java heap中。使用方法包括:
•直接使用字面量聲明,如String s = "abc";
•使用String.intern();
以上這篇淺談java常量池就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。