【发布时间】:2017-08-10 14:40:15
【问题描述】:
ArrayList 在其contains 方法中使用equals() 来查看提供对象是否等于文档中所说的列表中的任何项目:
如果此列表包含指定元素,则返回 true。更多的 正式地,当且仅当此列表包含至少一个时才返回 true 元素 e 使得 (o==null ? e==null : o.equals(e))。见this
我有这门课
class Foo
{
private String value;
public Foo(String value)
{
this.value = value;
}
@Override
public boolean equals(Object o)
{
return o == null ? this.value == null : o.toString().equals(this.value);
}
}
我想使用contains 方法来检查是否存在这样的项目
List<Foo> list = new ArrayList<Foo>();
Foo item1 = new Foo("item1");
Foo item2 = new Foo("item2");
list.add(item1);
list.add(item2);
System.out.println(item1.equals("item1")); //return true
System.out.println(list.contains("item1")); //false !! why?!
但是 contains 方法返回 false ,而 item1.equals("item1") 返回 true。
为什么contains在使用equals方法提供对象时返回false
【问题讨论】:
-
o是传递给contains的参数(在本例中为String),e是List的元素(您的类Foo)-@987654339 @ 不等于e.equals(o) -
在列表中查找实际的对象类型,而不是字符串。即在 FOO 列表中找到 FOO,而不是在 FOO 列表中找到 STRING
-
为什么要在 equals() 方法中使用“@override”?您的类没有扩展任何其他类,我认为您的 equal() 就像您要声明的任何其他方法一样。
-
@ZiMtyth 没有。他从
Object类中覆盖它。强烈建议您添加此注释,以确保您拥有良好的签名 -
@nathan,谢谢你的澄清:)