2012-11-12 96 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还缓存常用数字,因此您的整数都会引用同一个对象,这会使第二个参考比较为真。