JAVA中string創建對象詳解

    最近面試發現很多對string的考察,包括創建string對象,對string字符串進行替換等操作,一起看看string對象的創建過程:

    字符串對象是一種特殊的對象.String類是一個不可變的類.也就說,String對象一旦創建就不允許修改. String類有一個對應的String池,也就是 String pool.每一個內容相同的字符串對象都對應於一個pool裏的對象. 

一、 string堆中創建對象以及字符串常量池創建對象。

String s1 = new String(“xyz”);

 String s2 = “xyz”; 

String s3 = new String(“xyz”); 

System.out.println(s1 == s2); 

System.out.println(s1 == s3);

 System.out.println(s2 == s3); 

請問 前面三條語句分別創建了幾個對象,分別是什麼.後面的輸出分別是什麼 

(1)String s1= new String(“xyz”); 這句,創建了兩個對象..其內容都是”xyz”.注意,s1不是對象,只是引用.只有new生成的纔是對象. 創建的流程是,首先括號裏的”xyz”先到String pool裏看有沒”xyz”這個對象,沒有則在pool裏創建這個對象..所以這裏就在pool創建了一個”xyz”對象.然後 通過new語句又創建了一個”xyz”對象..而這個對象是放在內存的堆裏. .這裏的s1指向堆裏的對象.

 (2) String s2 = “xyz”; 這條語句,s2當然還是引用..後面的”xyz”.其實就是上面括號裏的”xyz”.執行的是相同的操作.即 在pool裏查找有沒”xyz”這個對象.沒有則創建一個…很顯然,第一條語句在pool裏已經創建了一個”xyz”.所以這條語句沒有創建對象,s2指向的是pool中的”xyz”

 (3)String s3 = new String(“xyz”); 這條語句,其實和第一條是一樣的,但是,因爲第一條已經在pool中創建了”xyz”這個對象,所以,這條語句創建了一個對象.s3指向的是堆裏的”xyz”.注意,雖然內容都是”xyz”,s1與s3表示的是不同的對象 

(4)接下來就很好說了.下面的三個==判斷.(注意,==永遠是判斷內存地址是否相等) s1與s2,一個指向堆裏的對象,一個指向pool裏的.很明顯是不同的對象.s1與s3.上面說了,雖然都是指向堆裏的對象,內容也是”abc”,但是也不是相同的對象.s1與s2比較s2指向pool,s1指向堆.也不是相同的對象.所以三個都返回false.

 二、 再看一下string中intern()方法

String s1= new String(“xyz”); 

String s2 = “xyz”; 

String s3 = new String(“xyz”);

System.out.println(s1== s2.intern()); 

System.out.println(s1 == s3.intern()); 

System.out.println(s2 == s3.intern()); 求最後輸出是什麼 解答.最後的答案是 false false true。 

intern()方法.按照jdk的幫助文檔來說,是返回字符串對象的規範化表示形式。通俗一點說,就是返回對應這個字符串內容的那個pool裏的對象.這樣說也許還看不太明白,那可以拿具體例子來說 s2.intern().他的執行流程是,在pool裏去查找s2對應的內容(也就是”xyz”).如果找到,則返回pool裏的對象.如果沒有則在Pool創建這個對象,並返回 這樣就很容易理解s2.intern返回的是pool裏的”xyz”對象.與s1這個堆裏的對象不想等,下面的同理了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章