各位大虾,看看这个下面的源代码.import java.util.ArrayList;
import java.util.HashSet;public class Foo {
    int value;
    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)));
    System.out.println(set.contains(new Foo(1)));
   }
}
}这是LIST的contains的API:
如果列表包含指定的元素,则返回 true。更确切地讲,当且仅当列表包含满足 (o==null ? e==null : o.equals(e)) 的元素 e 时才返回 true。 
这是SET的contains的API:
如果 set 包含指定的元素,则返回 true。更确切地讲,当且仅当 set 包含满足 (o==null ? e==null : o.equals(e)) 的元素 e 时返回 true。 
我的问题是为什么第一个输出 TRUE,第二个输出FALSE.
请教……

解决方案 »

  1.   

    2个不同的数据结构,其存储方式也不同,arraylist就像数组,而hashset是以key-value存放数据的,2者的contains方法判别不同,你前面实现了equals方法,这个方法只正对list有效,hashset 以key作为判别标准。HashSet set = new HashSet();
      list.add(new Foo(1));
    Foo f = new Foo(1);
      set.add(f);
      System.out.println(list.contains(new Foo(1)));
      System.out.println(set.contains(f));
    这个时候2个就是true了
      

  2.   

    public int hashCode(){
    return new Integer(value).hashCode();
    }要重写hashCode的,如果equal为true的话,那么hashcode必须相等。
      

  3.   

    hashset, hashmap,是用hashCode方法比较,然后再用equals比较的。