Java常量池的一點理解,Java常量池理解
關於網上的一個面試題,求輸出結果:
- /**
- *
- * @author DreamSea 2011-11-19
- */
- public class IntegerTest {
- public static void main(String[] args) {
- objPoolTest();
- }
-
- public static void objPoolTest() {
- Integer i1 = 40;
- Integer i2 = 40;
- Integer i3 = 0;
- Integer i4 = new Integer(40);
- Integer i5 = new Integer(40);
- Integer i6 = new Integer(0);
-
- System.out.println("i1=i2\t" + (i1 == i2));
- System.out.println("i1=i2+i3\t" + (i1 == i2 + i3));
- System.out.println("i4=i5\t" + (i4 == i5));
- System.out.println("i4=i5+i6\t" + (i4 == i5 + i6));
-
- System.out.println();
- }
- }
輸出的結果
i1=i2truei1=i2+i3 truei4=i5falsei4=i5+i6true
一些理解: 首先什麼是常量池 ?根據百度的回答,常量池是JVM中的一塊特殊的儲存空間。用於儲存類、介面、方法中的常量以及一些字串常量;當然也可以擴充執行器產生的常量也會放入常量池中。在編譯時間期就已經確定,是已存在的.class檔案中的一部分資料。也就是說,在程式運行還沒有動態輸入資料時,就已經存在了,這樣大大提高了程式運算的效率。
說說以上幾題的原因和Integer 首先 == 兩邊如果是對象,比較的是兩個對象的引用即地址,而不是其值。 i4 跟 i5 是兩個不同的對象 所以輸出falsei1跟i2相等,是因為 Integer中有一塊代碼塊作常量池用,存放-128~127間的常量值, 所以在這之間的每個數不會另外開闢一個地址,也就是說i1和i2是同一個對象,所以 輸出 true第二個 i1==i2+i3 為什麼返回的是 true,那是因為java有拆箱的特性,i1,i2,i3本來都是對象,但是在運算中都先自動轉換成int類型再進行比較,這時候 ==兩邊 比較的是運算值,所以相等 ,第四個 也是一樣道理。
那麼思考 如果是 Integer i1 = 128; Integer i2 = 128;System.out.println(i1==i2) 會是什麼結果呢?沒錯,程式輸出 false , 因為 128不在Integer的常量池中了。
再來簡單說說String的常量池String s1 = "hello";String s2 = "hello"String s3 = new String("hello");System.out.println( s1 ==s2);System.out.println( s1 ==s3); 會是什麼結果 ? 答案 : truefalse用new String()建立的字串是一個對象不是常量,不能在編譯期就確定,所以new String() 建立的字串不放入常量池中,它們有自己的地址空間。 OK再來一個
String s4 = "he"+new String("llo");System.out.println( s1 == s4);
結果 ?答案是 false , 所以只要是在String中new了一下便是一個新的對象了,兩個對象不相等,結果一定是false。