java - Java 中的字符串行为

标签 java string equals

因此,在下面的代码中,由于我使用了关键字 new,a == b 将返回 false,其行为符合预期。但是,当我打印内存地址时,我得到相同的值。我认为它们应该有单独的内存地址,如果它们相同为什么会 == 返回 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()相等的对象必须返回相同的hashCode。此要求记录在 Object 的 JavaDoc 中:http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html#equals%28java.lang.Object%29

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

如果您想进一步尝试该语言以弄清楚 == 的真正含义,请尝试尝试可变类型(例如 StringBuffer)。您将看到,如果您有两个 StringBuffer 引用 ab,且 ==,则修改 a 也会修改 b 的内容。另一方面,如果 ab 不是 ==,但 equals() 返回 true,则修改一个将使另一个完好无损。

关于java - Java 中的字符串行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33901718/

相关文章:

Java 的 equals 和 hashmap 问题

java - 我可以获取数组形式的声音数据吗?

java - 如何在Eclipse中查找所选成员的类型?

C++ std::string 内部内存处理

java - 为类编写简单的电子表格处理器。 Location 类的方法未通过单元测试。有什么帮助吗?

java - 在 Java 中覆盖 "equals()"方法的任何替代方法?

java - 应用于 Vector 的 equals() 不一致

java - Android 中 ListView 的自定义光标适配器的问题

Java 进程在 Linux (ubuntu 14.04) 上崩溃

php:在空白处将字符串分成两半,直到结果部分都不长于 x 个单词