Java 对象的equals()方法与字符串对象和我创建的对象的作用不同?
我对案例2和案例3中对象的.equals方法感到困惑。对于案例1,我可以理解引用和内容是相同的,所以我们分别得到了true和true 在案例2中,equals方法比较类型和内容,并根据文档返回true,它首先比较对象类型,然后比较内容。但是在第三种情况下,即使类型和内容相同,它也会返回False? 字符串对象有什么特殊的特性吗?任何帮助/提示/解释都将不胜感激Java 对象的equals()方法与字符串对象和我创建的对象的作用不同?,java,string,oop,methods,equals,Java,String,Oop,Methods,Equals,我对案例2和案例3中对象的.equals方法感到困惑。对于案例1,我可以理解引用和内容是相同的,所以我们分别得到了true和true 在案例2中,equals方法比较类型和内容,并根据文档返回true,它首先比较对象类型,然后比较内容。但是在第三种情况下,即使类型和内容相同,它也会返回False? 字符串对象有什么特殊的特性吗?任何帮助/提示/解释都将不胜感激 public class equalMethods { static class MyObject { 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();
}
}
自定义类的最佳实践是覆盖默认的equals方法。字符串有一个equals方法。您需要为对象类编写一个。默认值是比较内存中的引用,而不是字符串的内容。一般行为是,equals从对象类继承到所有java类及其默认实现中。所有类都应提供其对象所需的相等性。因此,如果您正在编写任何自定义类,通常是使用集合框架或实例相等的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)
因为这里它是从对象类调用equals方法。它只检查引用的相等性。两个对象都是不同的,因此都是错误的
这里调用String类中的equals实现,它检查引用相等和内容相等,以便匹配并返回true
如果要为任何类重写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的对象类获得equals方法,这对您来说不是很有用。String类定义了一个equals方法
一旦你给一个鼠标一个相等的值,他就会想要一个哈希码
Java已经有了一个对象类。我知道,我改了,结果还是一样,但我得到了下面的答案。谢谢。当重写equals时,总是重写hashCode,反之亦然。非常感谢您的解释!我得到了它。
@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);
}
@Override
public int hashCode() {
return this.name.hashCode();
}