Java 中的字符串行为

string behavior in Java

所以在下面的代码中,由于我使用了关键字 new,所以 a == b 的行为符合预期 return false。但是,当我打印内存地址时,我得到了相同的值。我认为它们应该有单独的内存地址,如果它们相同为什么 == return false。下面带有 j k l 的代码是相同的概念。

    String a = new String("test");
    String b = new String("test");

    System.out.println(a.equals(b));
    System.out.println(a == b);

    System.out.println(Integer.toHexString(a.hashCode()));
    System.out.println(Integer.toHexString(b.hashCode()));

    String j = "this";
    String k = new String("this");
    String l = "this";

    System.out.println(j.equals(l));
    System.out.println(j == l);

    System.out.println(Integer.toHexString(j.hashCode()));
    System.out.println(Integer.toHexString(l.hashCode()));

hashCode 预计不会打印内存地址(尽管默认实现可能)。这里的关键是 String 已经覆盖了 equals() 方法,因此必须覆盖 hashCode() 方法才能与其保持一致。也就是说,根据 equals() 相等的任何两个对象必须 return 相同的 hashCode。此要求记录在 Object 的 Java 文档中:http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals%28java.lang.Object%29

如果您试图简单地证明两个引用 ab 具有相同的内存地址,那么这基本上就是 Java 通过 == 揭示的内容.当且仅当两个引用指向完全相同的底层对象时,== 运算符才会 return 为真。 (您可以将其视为 "having the same memory address")。另一方面,如果对象在语义上相同,.equals() 是一种应该 return 为真的方法。 (例如,两个具有相同字符的不同字符串对象在语义上是相同的。)请注意 equals 是一种方法 - 它并不特殊 - 开发人员可以自由地将错误引入其中。

如果您想更多地尝试使用该语言以梳理出 == 的真正含义,请尝试使用可变类型(如 StringBuffer)。你会看到如果你有两个StringBuffer引用ab==,那么修改a也会修改[=17=的内容].另一方面,如果 ab 不是 ==,而是 equals() return 为真,修改其中一个将保持另一个不变。