public class Foo {
int value;
public Foo(int value){
this.value = value;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Foo){
Foo foo = (Foo)obj;
return value == this.value;
}else{
return false;
}
}
public static void main(String[] args) {
ArrayList<Foo> list = new ArrayList<Foo>();
HashSet<Foo> set = new HashSet<Foo>();
list.add(new Foo(1));
set.add(new Foo(1));
System.out.println(list.contains(new Foo(1)));
System.out.println(set.contains(new Foo(1)));
}}
打印结果是:
System.out.println(list.contains(new Foo(1)));//true
System.out.println(set.contains(new Foo(1)));//false
我认为2个都应该是true啊,不明白其原因,麻烦各位解释下,谢谢!
int value;
public Foo(int value){
this.value = value;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Foo){
Foo foo = (Foo)obj;
return value == this.value;
}else{
return false;
}
}
public static void main(String[] args) {
ArrayList<Foo> list = new ArrayList<Foo>();
HashSet<Foo> set = new HashSet<Foo>();
list.add(new Foo(1));
set.add(new Foo(1));
System.out.println(list.contains(new Foo(1)));
System.out.println(set.contains(new Foo(1)));
}}
打印结果是:
System.out.println(list.contains(new Foo(1)));//true
System.out.println(set.contains(new Foo(1)));//false
我认为2个都应该是true啊,不明白其原因,麻烦各位解释下,谢谢!
解决方案 »
- Exception in thread "main" javax.swing.text.ChangedCharSetException这个错误如何解决
- 位运算的问题,怎么判断一个数(二进制)右边起第二个数是0还是1
- eWebEditor编辑器,中文乱码
- Tomcat的问题高手帮忙
- 各位大哥,推荐一本j2ee入门书好吗
- 关于Spring里的JPetStore例子的问题.
- web打印
- Jboss的网站怎么上不去了呢??????????????
- 乱码问题遇到过不少这个是最头痛的(高手求高手)
- 公司要招聘JAVA程序员,进来看看
- spring中如何把log4j切片到service或者dao中?
- 如果将一个web项目改建成一个maven项目
int value;
public Foo(int value){
this.value = value;
}
@Override
public boolean equals(Object obj) {
if(obj instanceof Foo){
Foo foo = (Foo)obj;
//下一行是什么意思?
return value == this.value;
}else{
return false;
}
}
public static void main(String[] args) {
ArrayList<Foo> list = new ArrayList<Foo>();
HashSet<Foo> set = new HashSet<Foo>();
list.add(new Foo(1));
set.add(new Foo(1));
System.out.println(list.contains(new Foo(1)));
System.out.println(set.contains(new Foo(1)));
}}
如
public hashCode() {
return this.value;
}这样应该Set也能返回true了
set使用equals来进行重复判断,所以在你的第二次添加new Foo(1)时,它判断这个new Foo(1)已经和刚才添加的foo(1)重复了,所以不会插入,就返回false了。而list不会进行重复判断,它插入所有的值,不管是否重复
return value == this.value;
应该为
return foo.value == this.value;List.equals()返回true是因为它只用equals()作判断。Set接口有点不同,它的contains()是应用它的类各自实现的,因此如何做判断要具体情况具体分析。
比如HashSet的背后实际上是一个HashMap实例在支撑,它的contains()会判断equals()和hashCode()
而TreeSet的contains()不管equals(),只通过compareTo()进行判断
再有,你的方法也写错了,value是什么?if(obj instanceof Foo){
Foo foo = (Foo)obj;
return value == this.value;
1、HashSet的contains返回true,当且仅当equals返回true并且hashCode返回相等的值 ;2、list.contains(o),系统会对list中的每个元素e调用o.equals(e),方法,加入list中有n个元素,那么会调用n次o.equals(e),只要有一次o.equals(e)返回了true,那么list.contains(o)返回true,否则返回false。