錯誤修訂:SCJP認證套題解析之二第40題

40:
String s= "hello";
String t = "hello";
char c[] = {'h','e','l','l','o'} ;
Which return true?
A. s.equals(t);
B. t.equals(c);
C. s==t;
D. t.equals(new String("hello"));
E. t==c.
(acd)
題目:哪些返回true。
這個在前面第10題的equals()方法和==操作符的討論中論述過。==操作符比較的是操作符兩端的操作數是否是同一個對象,而String的equals()方法比較的是兩個String對象的內容是否一樣,其參數是一個String對象時纔有可能返回true,其它對象都返回假。需要指出的是由於s和t並非使用new創建的,他們指向內存池中的同一個字符串常量,因此其地址實際上是相同的(這個可以從反編譯一個簡單的測試程序的結果得到,限於篇幅不列出測試代碼和反編譯的分析),因此答案c也是正確的。
(文章原來漏選答案C,現在增加並修改分析),以下是測試代碼和反編譯分析:
public class  Tests
{
	public static void main(String[] args) 
	{
		String s= "hello";
		String t = "hello";
		if (s.equals(t)) {
			System.out.println("Hello World!");
		}
	}
}
反編譯的關鍵摘錄:
Method void main(java.lang.String[])
   0 ldc #2 <String "hello">
   2 astore_1
   3 ldc #2 <String "hello">
   5 astore_2
   6 aload_1
從標記爲0和3的兩條可以看出s和t指向的內存地址相同,程序運行結果也證明此結論。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章