黑马程序员技术交流社区
标题:
一位网友发来的面试题,大家围观了....
[打印本页]
作者:
我能驾驭住
时间:
2012-6-5 08:07
标题:
一位网友发来的面试题,大家围观了....
//重写了equals()而没有重写hashCode()方法
package Demo.collection;
import java.util.ArrayList;
import java.util.Iterator;
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 int hashCode() {
return this.value;
}
*/
public static void main(String... args) {
ArrayList list = new ArrayList();
HashSet set = new HashSet();
Foo f1 = new Foo(1);
Foo f2 = new Foo(1);
list.add(f1);
set.add(f2);
Foo f3 = new Foo(1);
Foo f4 = new Foo(1);
System.out.println(list.contains(f3) + "," + set.contains(f4));
}
}
运行结果:true false
打开注释:true true
作者:
郭宁
时间:
2012-6-5 08:15
o(︶︿︶)o 唉 看到代码不在 代码区 编辑发布,我都感觉~~~~~
作者:
刘克方
时间:
2012-6-5 08:44
当使用Hashset时,hashcode()方法会被调用,判断以存储在集合中的对象的hashcode值是否与将要添加的对象的hashcode值一样;如果不一样,就直接将对象加入集合,如果一样,再进行equals方法比较,如果equals方法返回true表示该对象在集合中已存在,不会添加进去,如果equals返回false,则将对象添加进去。
这里要注意下:如果不重写hashcode和equals方法,父类Object的hashcode()方法返回的对象在内存的地址,equals方法也一样;这就是出现上面结果的原因
作者:
黑马11期李项京
时间:
2012-6-5 09:27
如果是我,可能这样回答,ArrayList 不用比较hashcode,在list.contains(f3)中,程序通过list的equals()判断list中有没f3这个对象,而HashSet 要比较hashcode,所以在set.contains(f4)中,程序通过equals()和hashCode()判断set集合中有没f4,默认初始化每个对象的hashCode都不同,所以要覆盖set中的hashCode()方法
作者:
丰亚彬
时间:
2012-6-5 10:25
这个面试题应该是考List和Set的区别
List集合元素可以重复,判断元素相同调用equals方法
Set集合元素不可以重复,判断元素相同使用hashCode和equals两个方法
作者:
liumeng
时间:
2012-6-5 11:34
HashSet先判断hashcode如果相同在判断equal如果不同则返回false
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2