本帖最后由 黄小贝 于 2012-10-6 03:06 编辑
楼主你好~我是来砸场子的~{:soso__3880293213992091465_4:}
首先不论楼主你的equal函数能不能通过编译~(可以自己试下)
让我们用实验证明~
import java.util.HashSet;
import java.util.Set;
public class Student {
private int s_id;
public Student(int sId) {
s_id = sId;
}
/* public int hashCode() {
return s_id;
}*/
public boolean equals(Object obj) {
if(this == obj){
return true;
}
if (obj instanceof Student) {
Student s = (Student) obj;
return this.s_id == s.s_id;
}
return false;//这是楼主不通过编译的原因
}
public static void main(String[] args) {
Student student1 = new Student(1);
Student student2 = new Student(1);
Set<Student> set = new HashSet<Student>();
set.add(student1);
set.add(student2);
System.out.println(set.size());//得到的结果是2
}
}
我用了一个HashSet add两个id一样Student对象~~然后我们可以很明显的发现~~打印值为2,也就是说~ 尽管重写equal方法~这两个对象还是被HashSet判断成不同~~
原因是什么~ 因为没有重写 hashcode方法~
写到这里,我又手贱看了一下JDK源码,发现了为什么没有重写hashcode 就会有这样的结果~~
让我们一路跟踪到 HashMap的put方法~ 哇咔咔~ 我也是今天才知道的~
public V put(K key, V value) {
if (key == null)
return putForNullKey(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
for (Entry<K,V> e = table; e != null; e = e.next) {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
V oldValue = e.value;
e.value = value;
e.recordAccess(this);
return oldValue;
}
}
modCount++;
addEntry(hash, key, value, i);
return null;
}
|