2012-02-26 72 views
4

...換句話說: 假設我有2個字符串聲明爲這樣:如何檢查實現內容相等的對象中的引用相等性?

String one = new String("yay!"); 
String two = new String("yay!"); 

這兩個字符串是兩個不同的對象,但如果我跑

if(one.equals(two)) 
    System.out.println("equals() returns true."); 

我得到的「平等()返回true「。 這是因爲String類重寫equals()方法來實現內容級別相等。 但是,我需要訪問一個參考級別的相等(如在Object中實現的那個)來區分對象和對象之一。 我該怎麼做?

我嘗試這樣做:

one.getClass().getSuperclass().equals(); 

,試圖調用該對象等於字符串一個()的方法,但沒有奏效。

有什麼建議嗎?

+1

您是否在尋找''==? – 2012-02-26 13:09:46

+1

我不想脫離主題,但是我想添加這些信息,我認爲這對那些在這個問題上失敗的人會有幫助。我的問題是能夠處理實現內容相等性的對象作爲獨特的元素。當然,我的問題的另一方面是在HashMap 中使用它們作爲關鍵元素。存在用於實現此目的的Map實現,即[IdentityHashMap](http://docs.oracle.com/javase/1.4.2/docs/api/java/util/IdentityHashMap.html)。 – MaVVamaldo 2012-02-27 08:00:07

回答

2

在Java String使用String Literal Pool,這意思是:「當你試圖創建一個字符串,第一String類的搜索結果在Literal Pool傳統相同的字符串,如果存在返回它,如果不存在創建」,所以你不能equals方法檢查字符串比較實例的refernce,你必須使用==操作如下:

String one = new String("yay!"); 
String two = new String("yay!"); 
if(one.equals(two)) 
    System.out.println("equals() returns true."); 
if(one == two) 
    System.out.println(" == operator returns true."); 

結果是:

equals() returns true. 

見下鏈路F以上信息:

  1. http://blog.enrii.com/2006/03/15/java-string-equality-common-mistake/
  2. Java String.equals versus ==
1
if (one == two) 
    System.out.println("one and two are the same object"); 
0

唯一你需要的是「==」等號運算符。

2

如果你想查詢參考剛剛執行:

one == two 

但要小心的字符串。有一種叫String constant pool的東西,所以它們可能會引用同一個對象。

+1

你是對的,但是「常量池」是類文件中的數據結構,另一個是*字符串實習池*,你引用的技術稱爲字串實習。 – 2012-02-26 13:16:22

1

使用簡單的==進行比較。但爲避免String實習,您必須使用char陣列創建字符串,例如:String me = new String(new char[] { 'm', 'e' });而不是使用字符串文字"me",例如String me = new String("me");

+0

知道的很好,謝謝。不幸的是,我無法控制字符串的創建,因爲它們是由JAX2B編組器以XML輸入形式安裝的。也許它可以配置爲避免字符串實習機制,但我不這麼認爲。 – MaVVamaldo 2012-02-27 09:22:29