关于list集合和set集合的问题请大神指导一下
请问各位大牛list和set调用contains方法时是比较两个元素的地址,还是调用他们的equals方法呢?
public class Foo {
int value;
public Foo(int value) {
this.value = value;
}
public boolean equals(Object obj) {
if (obj instanceof Foo) {
Foo foo = (Foo) obj;
return value == foo.value;
} else {
return false;
}
}
public static void main(String[] args) {
//运行下面程序段:
ArrayList list = new ArrayList();
HashSet set = new HashSet();
list.add(new Foo(1));
set.add(new Foo(1));
System.out.println(list.contains(new Foo(1)) + ","+ set.contains(new Foo(1)));
//或者
System.out.println(new Foo(1).equals (new Foo(1)) + ","+ set.contains(new Foo(1)));
}
}
我想问的就是为什么这个输出的结果是true,false
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我查了下源码,我觉得
HashSet
的Hash
这里有文章。1.首先看添加元素的过程
//HashSet代码
向
HashSet
内部维护的map
添加新元素//HashMap代码
可以看出会对
Element
做哈希,所以如果添加Foo(1)
的话,保存到HashSet
过程中也少不了这个环节的。再来看比较的情况
//HashSet代码
//HashMap代码
结论
插入
HashSet
容器时对元素做哈希,判断容器是否含有某个元素时也要对元素做哈希,他们比较的是元素的哈希值。equals的方法,但是值得注意的是二楼说的是String下的equals方法,因为String的equals方法是重写过的,如果题主希望通过contains方法对于一般Object的比较的话,还是得和String一样重写equals方法,确定何种规则
这个是
AbstractCollection
的实现,AbstractList
,AbstractSet
都是以此为父类实现的.