英文原文: Java Success
ImportNew註: 本文是ImportNew編譯整理的Java面試題系列文章之一。上一篇是《Java 面試題問答:編譯時間與運行時》。你可以從這裡查看全部的Java面試系列。
Q2.下面的程式碼片段的輸出是什嗎?
12345678 |
Object s1 = new String( "Hello" ); Object s2 = new String( "Hello" ); if (s1 == s2) { System.out.println( "s1 and s2 are ==" ); } else if (s1.equals(s2)) { System.out.println( "s1 and s2 are equals()" ); } |
A2.輸出結果是:
s1 and s2 are equals()
可以用下面這個圖來解釋:
因此,上面的問題考察了面試者對”==” 和 “equals( )”在Java對象上如何應用的理解是否正確。前者比較引用,後者則比較對象中真正的值。
接著還可以有下面的問題:
Q.下面程式碼片段的輸出是什嗎?
12345678 |
Object s1 = "Hello" ; Object s2 = "Hello" ; if (s1 == s2) { System.out.println( "s1 and s2 are ==" ); } else if (s1.equals(s2)) { System.out.println( "s1 and s2 are equals()" ); } |
A.答案是:
s1 and s2 are ==
看上去這個答案和對前面一個問題所做的解釋似乎有所違背。事實上,這個例子(或者說,規則)比較特殊,是一個典型的flyweight 模式在字串對象建立中的應用。這個模式通過減少對象的建立來節約記憶體。String對象會建立一個字串池(a pool of string),如果當前準備新建立的字串對象的值在這個池子中已經存在,那麼就不會產生新對象,而是複用池中已有的字串對象。flyweight 模式的精髓就是對象複用。不過,只有採用Object s = “Hello”方式(而非用”new“關鍵字)聲明String對象的時候這個規則才會被應用。
這是一個非常經常被採用的Java面試問題。