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啊,不明白其原因,麻烦各位解释下,谢谢!

解决方案 »

  1.   

    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)));
        }}
      

  2.   

    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。
      

  3.   

    Set除了比较equals,还比较hashCode,所以你重写一个hashCode方法,返回一样的值就可以了

    public hashCode() {
        return this.value;
    }这样应该Set也能返回true了
      

  4.   


    set使用equals来进行重复判断,所以在你的第二次添加new Foo(1)时,它判断这个new Foo(1)已经和刚才添加的foo(1)重复了,所以不会插入,就返回false了。而list不会进行重复判断,它插入所有的值,不管是否重复
      

  5.   

    首先你的equals()里面这句写错了
    return value == this.value;
    应该为
    return foo.value == this.value;List.equals()返回true是因为它只用equals()作判断。Set接口有点不同,它的contains()是应用它的类各自实现的,因此如何做判断要具体情况具体分析。
    比如HashSet的背后实际上是一个HashMap实例在支撑,它的contains()会判断equals()和hashCode()
    而TreeSet的contains()不管equals(),只通过compareTo()进行判断
      

  6.   

    重写equals时请保证你的hashCode也重写了。
      

  7.   

    一般重写了equals方法,也重写hasCode方法吧。不然可能就出错。
    再有,你的方法也写错了,value是什么?if(obj instanceof Foo){
       Foo foo = (Foo)obj;
       return value == this.value;
      

  8.   

    我顶。
    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。