日期:2014-05-20 浏览次数:20839 次
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的,这个程序换个写法就看的很清楚了
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
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
我记得这是在学校的时候老师出的一道选择题……
------解决方案--------------------