对象的 equals() 方法与 String 对象和我创建的对象的行为不同吗?
equals() method of objects is acting different with String objects and the Objects I created?
我对案例2和案例3中对象的.equals()方法感到困惑。对于案例1,我可以理解引用和内容是相同的,所以我们分别得到了true,true。
在情况2中,equals()方法比较了类型和内容,returns为真(根据文档,它先比较对象类型,然后再比较内容)。然而在第三种情况下,即使类型和内容相同,它 returns False! ?
String 对象有什么特别之处吗?任何帮助/提示/解释表示赞赏。
public class equalMethods {
static class MyObject {
String name;
// constructor
MyObject(String s) {
this.name = s;
}
}
public static void main(String[] args) {
// ***CASE 1****
String a = "str1";
String b = "str1";
System.out.println(a == b); // True
System.out.println(a.equals(b));// True
System.out.println();
// ***CASE 2****
String an = new String("oracle");
String bn = new String("oracle");
System.out.println(an == bn); // False
System.out.println(an.equals(bn));// True ( ? Compare with case 3)
System.out.println();
// // ***CASE 3****
MyObject object1 = new MyObject("str1");
MyObject object2 = new MyObject("str1");
System.out.println(object1 == object2); // False
System.out.println(object1.equals(object2)); // False ( ? Compare with case 2)
System.out.println();
}
}
自定义 class 的最佳做法是覆盖默认的 equals 方法。 String 有一个 equals 方法。您需要为您的对象 class 编写一个。默认是比较内存中的引用,而不是字符串的内容。
一般行为是,equals()
从 Object
class 继承到所有 java class 及其默认实现。所有 classes 都应该为其对象提供所需的相等性。因此,如果您正在编写任何使用集合框架或使用实例相等性的自定义 class(通常是 POJO),那么您应该在各自的实例成员上实现 equals()
方法。
Object object1 = new Object("sam");
Object object2 = new Object("sam");
System.out.println(object1 == object2); // False
System.out.println(object1.equals(object2)); // False ( ? Compare with case 2)
因为这里是从Object
class调用equals()
方法。仅检查引用相等性。两个对象都不同,因此 false
.
String an = new String("oracle");
String bn = new String("oracle");
System.out.println(an == bn); // False
System.out.println(an.equals(bn));// True ( ? Compare with case 3)
此处调用了 String
class 的 equals()
实现,它检查引用相等性和内容相等性,因此它匹配 returns true
.
如果您要为任何 class 覆盖 equals()
的行为,建议也覆盖 hashCode()
方法。
您想在 MyObject def 中添加这样的内容:
@Override
public boolean equals(Object obj) {
if (!(obj instanceof MyObject)) return false;
if (obj == this) return true;
MyObject that = (MyObject)obj;
return this.name.equals(that.name);
}
否则你会从java的对象class中获取equals()
方法,这对你来说用处不大。字符串 class 定义了一个 equals()
方法。
一旦你给老鼠一个equals()
,他就会想要一个hashCode()
...
@Override
public int hashCode() {
return this.name.hashCode();
}
我对案例2和案例3中对象的.equals()方法感到困惑。对于案例1,我可以理解引用和内容是相同的,所以我们分别得到了true,true。
在情况2中,equals()方法比较了类型和内容,returns为真(根据文档,它先比较对象类型,然后再比较内容)。然而在第三种情况下,即使类型和内容相同,它 returns False! ? String 对象有什么特别之处吗?任何帮助/提示/解释表示赞赏。
public class equalMethods {
static class MyObject {
String name;
// constructor
MyObject(String s) {
this.name = s;
}
}
public static void main(String[] args) {
// ***CASE 1****
String a = "str1";
String b = "str1";
System.out.println(a == b); // True
System.out.println(a.equals(b));// True
System.out.println();
// ***CASE 2****
String an = new String("oracle");
String bn = new String("oracle");
System.out.println(an == bn); // False
System.out.println(an.equals(bn));// True ( ? Compare with case 3)
System.out.println();
// // ***CASE 3****
MyObject object1 = new MyObject("str1");
MyObject object2 = new MyObject("str1");
System.out.println(object1 == object2); // False
System.out.println(object1.equals(object2)); // False ( ? Compare with case 2)
System.out.println();
}
}
自定义 class 的最佳做法是覆盖默认的 equals 方法。 String 有一个 equals 方法。您需要为您的对象 class 编写一个。默认是比较内存中的引用,而不是字符串的内容。
一般行为是,equals()
从 Object
class 继承到所有 java class 及其默认实现。所有 classes 都应该为其对象提供所需的相等性。因此,如果您正在编写任何使用集合框架或使用实例相等性的自定义 class(通常是 POJO),那么您应该在各自的实例成员上实现 equals()
方法。
Object object1 = new Object("sam");
Object object2 = new Object("sam");
System.out.println(object1 == object2); // False
System.out.println(object1.equals(object2)); // False ( ? Compare with case 2)
因为这里是从Object
class调用equals()
方法。仅检查引用相等性。两个对象都不同,因此 false
.
String an = new String("oracle");
String bn = new String("oracle");
System.out.println(an == bn); // False
System.out.println(an.equals(bn));// True ( ? Compare with case 3)
此处调用了 String
class 的 equals()
实现,它检查引用相等性和内容相等性,因此它匹配 returns true
.
如果您要为任何 class 覆盖 equals()
的行为,建议也覆盖 hashCode()
方法。
您想在 MyObject def 中添加这样的内容:
@Override
public boolean equals(Object obj) {
if (!(obj instanceof MyObject)) return false;
if (obj == this) return true;
MyObject that = (MyObject)obj;
return this.name.equals(that.name);
}
否则你会从java的对象class中获取equals()
方法,这对你来说用处不大。字符串 class 定义了一个 equals()
方法。
一旦你给老鼠一个equals()
,他就会想要一个hashCode()
...
@Override
public int hashCode() {
return this.name.hashCode();
}