ser*_*ent -1 java oop string methods equals
我对案例2和案例3中的对象的.equals()方法感到困惑.对于案例1,我可以理解引用和内容是相同的,所以我们分别得到了true,true.
在案例2中,equals()方法比较类型和内容,并返回true(根据文档,它首先比较对象类型,然后比较内容).但是在第三种情况下,即使类型和内容相同,它也会返回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();
}
}
Run Code Online (Sandbox Code Playgroud)
一般行为是,equals()从Object类继承到所有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)
Run Code Online (Sandbox Code Playgroud)
因为这里是equals()从Object类中调用方法.其中仅检查引用相等.两个对象都是不同的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)
Run Code Online (Sandbox Code Playgroud)
这里调用类的equals()实现String,它检查引用相等性和内容相等性,以便匹配并返回true.
如果要覆盖equals()任何类的行为,建议也重写hashCode()方法.