2013-02-11 54 views
1

我是新來這個網站,並沒有意識到還有其他問題,回答我問。我已經想通了,我會盡快刪除這篇文章。謝謝。在java中,==運算符和.equals字符串是如何相同的?

我剛開始學習java,我有一個簡單的問題。

通常情況下,使用==來比較字符串將不起作用,您將不得不使用.equals。

但是現在編碼時,我發現他們在做同樣的事情時,他們不應該太瞭解,我試圖找出原因。

這是代碼。

String s = "Hello"; 
    String x = "Hello"; 

    if (x == s){ 
     System.out.println("It is working!"); 
    }//end if 
    else { 
     System.out.println("It is not working"); 
    }//end else 

    if (x.equals(s)){ 
     System.out.println("Match"); 
    }//end if 
    else { 
     System.out.println("No match"); 
    }//end else 
+3

做得好,OP,你提出了這個網站上最常見的問題。它列在[Java](http://stackoverflow.com/tags/java/info)標籤本身的常見問題(當然是第一個條目)下。 – 2013-02-11 17:07:33

+0

對不起。我沒有意識到有所有這些回答我的問題。我剛加入這個網站,我會盡快刪除這個帖子。謝謝你。 – MrTimotheos 2013-02-11 17:23:46

回答

4

基本上你看到了字符串實習的結果。從section 15.28 of the JLS

String類型的編譯時常量表達式始終是「interned」的,以便使用方法String.intern共享唯一實例。

因此,您的兩個變量值實際上是指相同的字符串。如果您使用:

String s = new String("Hello"); 
String x = new String("Hello"); 

...然後您會看到您期望的行爲。

0

原因是你的瓦爾X和s因此==相同的行爲一樣.equals

當Java編譯器優化字符串值(文字)時,它確定x和s都具有相同的值,因此只需要一個String對象。結果,x和s都指向相同的String對象,並保存了一些小內存。這是安全的操作,因爲String是Java中的不可變對象。

0

井,在這種特定情況下,只有一個字符串對象創建並在字符串常量池緩存和兩個參考變量指的是存儲在字符串常量池的相同字符串對象 。因此你==測試通過

String s =「Hello」;第1行 String x =「Hello」;第2行

執行第1行時,會創建一個字符串對象(Hello)並將其緩存到字符串常量池中。

**String Constant Pool:** {s--->"Hello"} 

當執行第2行時,它首先檢查字符串常量池中是否存在任何具有相同值的對象,如果存在的話。它只是將引用指向池中已經創建的對象。

**String Constant Pool:** {s,x--->"Hello"} 
相關問題