日期:2014-05-20  浏览次数:20839 次

java中集合
class Foo{
  int value = 1;
  public void test(int value){
  this.value = value;
  }
  public static void main(String[] a){
  ArrayList list = new ArrayList();
  Set set = new HaspSet();
  list.add(new Foo(1));
  set.add(new Foo(1));
  System.out.print(list.contains(new Foo(1))+","+set.contains(new Foo(1));
  }
}
这题的答案是true,false!
list和set除了元素的顺序和元素的重复,还有啥不同之处吗?为什么set是false呢?或者说为什么list是true呢?

------解决方案--------------------
Java code
class Test1 {
    int value = 1;

    public Test1(int i) {
        value = i;
    }

    public void test(int value) {
        this.value = value;
    }

    public static void main(String[] a){
  ArrayList list = new ArrayList();
  Set set = new HashSet();
  list.add(new Test1(1));
  set.add(new Test1(1));
  System.out.print(list.contains(new Test1(1))+","+set.contains(new Test1(1)));
  }
}

------解决方案--------------------
要是原题是2楼给的程序,肯定是不等的,contains(Object obj)方法是检验集合中是否包含有与obj相等的对象,new了两个相当于创建了2个对象,只添加了第一次,所以肯定不包含第二次new的,这个程序换个写法就看的很清楚了
Java code

ArrayList list = new ArrayList();
Test t1 = new Test(1);   
Test t2 = new Test(1);   
list.add(t1);
System.out.println(list.contains(t2));

------解决方案--------------------
list和set的区别
list会比较equals
set会比较equals和hashCode
如果这些方法都没有重写,就被认为是不同的而调用Object的缺省方法,那么因为是不同的new必然会false

Java code
class Foo{
    int value = 1;
    public Foo(int value){
        this.value = value;
    }
    @SuppressWarnings("unchecked")
    public static void main(String[] a){
        ArrayList list = new ArrayList();
        Set 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)));
  }

/* 把这个注释去掉试试看
  public boolean equals(Object o) {
      if (o == null) return false;
      else if (o.getClass() != this.getClass()) return false;
      return this.value == ((Foo)o).value;
  }
*/
/* 再把这个注释去掉试试看
  public int hashCode() {
      return this.value;
  }
*/
}

------解决方案--------------------
contains( new Foo(1) )
你创建了另一个对象
------解决方案--------------------
5L正解
Set会比较hashcode
我记得这是在学校的时候老师出的一道选择题……
------解决方案--------------------
探讨
list和set的区别
list会比较equals
set会比较equals和hashCode
如果这些方法都没有重写,就被认为是不同的而调用Object的缺省方法,那么因为是不同的new必然会false


Java code
class Foo{
int value = 1;
public Foo(int value){
this.value……