日期:2014-05-20 浏览次数:21009 次
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
我记得这是在学校的时候老师出的一道选择题……
------解决方案--------------------