一、等价性equals()和==
(1)equals()和==的区别:
“==” 运算符用于比较两个对象的引用是否指向相同的内存地址,也就是比较它们是否是同一个对象的实例。而 equals()
方法是用来比较对象的内容是否相等,通常是在类中进行重写以实现自定义的相等性比较逻辑。
总的来说,==
比较的是对象的引用,而 equals()
比较的是对象的内容。
默认的equals()
方法是用来比较对象的引用,也就是说它的行为与==
运算符是一样的。
故需要对equals()进行重写
即 “==”à引用等价性(判断地址),equals()à对象等价性(判断内容)
同时,在自定义ADT时,需要重写Object的equals()
对基本数据类型,使用==判定相等;对对象类型,使用equals()判断相等
二、重写equals()函数
解读:
第一个if首先检查当前对象 (this
) 是否与传入的对象 (obj
) 是同一个对象(引用相同),若相同则返回true。
第二个if,首先检查传入的对象 obj
是否为 null
。然后
检查当前对象的类是否与传入对象的类相同,这里使用 getClass()
方法而不是 instanceof
关键字,因为 instanceof
检查的是继承关系,而 getClass()
检查的是对象是否是确切的同一个类。这意味着即使子类对象传入,比较也会返回 false
最后对字符进行比较,
将 obj
强制类型转换为 MyClass
类型,因为在前面已经确保了 obj
和当前对象是同一个类,比较两个对象的 value
字段。如果它们的 value
相等,返回 true
,否则返回 false
。
或者
三、重写hashCode()函数
为什么要重写equals()函数后必须重写hashCode()函数?
如果只重写equals()
而不重写hashCode()
,会导致在基于哈希的数据结构中(如HashSet
、HashMap
)出现意想不到的行为。即使两个对象是相等的(根据equals()
),它们可能会被存储在不同的桶中,因为默认的hashCode()
方法是基于对象的内存地址生成的。
- 可变类型/不可变类型
观察等价性:在不改变状态的情况下, 两个 mutable 对象是否看起来一致 (某一时刻两者是否相同)
行为等价性:调用对象的任何方法都展示出一致的结果