很明显,equals()
(当然还有hashCode()
)在处理不可变值对象时很有价值 - 地图键,强类型字段值需要在对象之间进行比较包含它们等等。
但是除了价值对象之外,你有多少次经常会有两个独立构建的实例,并希望它们是equal
?
我很难想象一个现实的场景,即参照平等不会,事实上,得到你想要的东西;在这些特定情况下,似乎情景特定的等价方法(isEquivalentTo(Foo)
而不是equals(Object)
)会更安全。特别是对于可变对象?
非值类型中equals()
的用例是什么?
答案 0 :(得分:0)
庵。 Set<E>
是可变的,并且具有equals()
的(有用的)定义。那似乎毫无用处......
答案 1 :(得分:0)
接口列表&lt; E&gt;
boolean contains(Object o)
Returns true if this list contains the specified element.
更正式地说,当且仅当此列表包含至少一个时,才返回true 元素e这样 (o == null?e == null: o.equals(e))。
因此,覆盖equals
对此(和其他)语言结构非常有用。
考虑一下(抱歉,它在C#中):
class MimeType
{
public string Name { get; set; }
public string Extension { get; set; }
public override bool Equals(object obj)
{
var other = obj as MimeType;
if (other == null) return false;
return other.Name == Name;
}
}
class Program
{
void Main()
{
var jpeg1 = new MimeType();
jpeg1.Name = "image/jpeg";
jpeg1.Extension = ".jpg";
var jpeg2 = new MimeType();
jpeg2.Name = "image/jpeg";
jpeg2.Extension = ".jpeg";
var list = new List<MimeType>();
list.Add(jpeg1);
if (!list.Contains(jpeg2))
list.Add(jpeg2);
}
}
在上面的示例中,jpeg2
对象不会添加到列表中,因为列表已包含等效实例。
<强>更新强>
为了好玩,我将Extension
成员添加到了MimeType
类。