String 經典內存指向面試題

1
public static void main(String[] args) {  
        String a = "a1";  
        String b = "a" + 1;  
        System.out.println(a == b);  
    } 
2
public static void main(String[] args) {   
        String a = "ab";   
        String bb = "b";   
        String b = "a" + bb;   
        System.out.println(a == b);   
    } 
3
public static void main(String[] args) {   
        String a = "ab";   
        final String bb = "b";   
        String b = "a" + bb;   
        System.out.println(a == b);   
    } 
4
public static void main(String[] args) {   
        String a = "ab";   
        final String bb = getBB();   
        String b = "a" + bb;   
        System.out.println(a == b);   
    }   
  
    private static String getBB() {   
        return "b";   
    } 
5
private static String a = "ab";   
  
public static void main(String[] args) {   
    String s1 = "a";   
    String s2 = "b";   
    String s = s1 + s2;   
    System.out.println(s == a);   
    System.out.println(s.intern() == a);   
} 
6
private static String a = new String("ab");   
  
    public static void main(String[] args) {   
        String s1 = "a";   
        String s2 = "b";   
        String s = s1 + s2;   
        System.out.println(s == a);   
        System.out.println(s.intern() == a);   
        System.out.println(s.intern() == a.intern());   
    } 
=========================================================================================================

3、六道題答案詳解
1)true
    要說明一點:當兩個字符串字面值連接時(相加),得到的新字符串依然是字符串字面值,保存在常量池中。
2)false
    當字符串字面值與String類型變量連接時,得到的新字符串不再保存在常量池中,而是在堆中新建一個String對象來存放。很明顯常量池中要求的存放的是常量,有String類型變量當然不能存在常量池中了。
 3)true
    注意此題與上一題的區別,此處是字符串字面值與String類型常量連接,得到的新字符串依然保存在常量池中。
4)false
    此題中第條語句:final String bb = getBB();其實與final String bb = new String(“b”);是一樣的。也就是說return “b”會在堆中創建一個String對象保存”b”,雖然bb被定義成了final。可見並非定義爲final的就保存在常量池中,很明顯此處bb常量引用的String對象保存在堆中,因爲getBB()得到的String已經保存在堆中了,final的String引用並不會改變String已經保存在堆中這個事實。
5)false,true
    可能很多人對intern()這個函數不瞭解。JDK API文檔中對intern()方法的描述是:
    返回字符串對象的規範化表示形式。
    一個初始爲空的字符串池,它由類 String 私有地維護。
    當調用 intern 方法時,如果池已經包含一個等於此 String 對象的字符串(用 equals(Object) 方法確定),則返回池中的字符串。否則,將此 String 對象添加到池中,並返回此 String 對象的引用。
    它遵循以下規則:對於任意兩個字符串 s 和 t,當且僅當 s.equals(t) 爲 true 時,s.intern() == t.intern() 才爲 true。
    所有字面值字符串和字符串賦值常量表達式都使用 intern 方法進行操作。
上面字符串池即爲字符串常量池。明白該題結果的原因了吧。
6)false,false,true




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