为什么程序会打印“true”“true”?

时间:2012-11-12 16:05:45

标签: java

  

可能重复:
  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()。但是为什么这样可以呢?

3 个答案:

答案 0 :(得分:2)

==比较对象引用。因为你是字符串被硬编码,所以它们被实习并且都使用相同的引用,因此第一个是真实的。此外,Integer还缓存常用的数字,因此两个整数也引用相同的对象,这使得第二个引用比较成立。

答案 1 :(得分:1)

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

st1 存储在字符串常量池中(首次创建时);当编译器看到st2="abc"时,它只会将 st2 指向字符串常量池中先前创建的对象。 即, st1 st2 指向String常量池中的同一对象("abc"),==运算符检查两个引用变量是否指向同一个对象。

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

在这种情况下,您的包装器实例被缓存到较小的范围,因此==返回true。

答案 2 :(得分:1)

1)两个字符串都将被视为字符串文字,将被插入并存储到相同的内存位置。

==检查引用相等性,因此两个引用都指向同一个对象并返回true。

2)Integer个实例的缓存范围很小,这就是k1 == k2100返回true的原因。