2012-11-12 93 views
-2

可能重複:
Why are these == but not `equals()`?爲什麼程序會打印「真」「真」?

爲什麼這個代碼將打印

真正

真正

public class Test { 
     public static void main(String[] args){ 
      String st1 = "abc"; 
      String st2 = "abc"; 

      Integer k1 = 100; 
      Integer k2 = 100; 

      System.out.println(st1 == st2); 
      System.out.println(k1 == k2); 
     } 
    } 

要比較對象,我們使用方法equals()。但爲什麼這樣可以呢?

+0

**你期望什麼?爲什麼? –

+0

由於字符串文字和小整數被禁用。 –

+1

還有:http://stackoverflow.com/questions/3281448/strings-in-java-equals-vs。然後:http://stackoverflow.com/questions/10673632/javahow-come-2-literalsthe-same-contents-in-2-classes-use-the-same-interned-s –

回答

1
 System.out.println(st1 == st2); 

ST1被存儲在字符串常量池(當第一創建);當編譯器看到st2="abc"時,它只會將st2指向字符串常量池中先前創建的對象。 即ST1ST2指向在字符串常量池和==操作者檢查是否兩個參考變量指向相同的對象相同的對象(​​)。

 System.out.println(k1 == k2); 

在這種情況下,您的包裝器實例被緩存到小範圍,因此==返回true。

1

1)這兩個字符串將被視爲字符串文字,將被實施並存儲到相同的內存位置。

==檢查引用相等性,所以兩個引用指向相同的對象並返回true。

2)Integer實例被緩存爲小範圍,這就是爲什麼k1 == k2100返回true。

2

==比較對象引用。由於你的字符串是硬編碼的,所以它們被實施並且都使用相同的引用,因此是第一個真實的。 Integer還緩存常用數字,因此您的整數都會引用同一個對象,這會使第二個參考比較爲真。