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
如果您试图简单地证明两个引用 a
和 b
具有相同的内存地址,那么这基本上就是 Java 通过 ==
揭示的内容.当且仅当两个引用指向完全相同的底层对象时,==
运算符才会 return 为真。 (您可以将其视为 "having the same memory address")。另一方面,如果对象在语义上相同,.equals()
是一种应该 return 为真的方法。 (例如,两个具有相同字符的不同字符串对象在语义上是相同的。)请注意 equals
是一种方法 - 它并不特殊 - 开发人员可以自由地将错误引入其中。
如果您想更多地尝试使用该语言以梳理出 ==
的真正含义,请尝试使用可变类型(如 StringBuffer
)。你会看到如果你有两个StringBuffer
引用a
和b
是==
,那么修改a
也会修改[=17=的内容].另一方面,如果 a
和 b
不是 ==
,而是 equals()
return 为真,修改其中一个将保持另一个不变。
所以在下面的代码中,由于我使用了关键字 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
如果您试图简单地证明两个引用 a
和 b
具有相同的内存地址,那么这基本上就是 Java 通过 ==
揭示的内容.当且仅当两个引用指向完全相同的底层对象时,==
运算符才会 return 为真。 (您可以将其视为 "having the same memory address")。另一方面,如果对象在语义上相同,.equals()
是一种应该 return 为真的方法。 (例如,两个具有相同字符的不同字符串对象在语义上是相同的。)请注意 equals
是一种方法 - 它并不特殊 - 开发人员可以自由地将错误引入其中。
如果您想更多地尝试使用该语言以梳理出 ==
的真正含义,请尝试使用可变类型(如 StringBuffer
)。你会看到如果你有两个StringBuffer
引用a
和b
是==
,那么修改a
也会修改[=17=的内容].另一方面,如果 a
和 b
不是 ==
,而是 equals()
return 为真,修改其中一个将保持另一个不变。