为啥containsKey()方法不需要重写equals()方法????
为啥调用congtainsKey()的时候没有出现错误???
为啥调用congtainsKey()的时候没有出现错误???
2020-04-05
如果key是自定义类型,那就要重写equals方法,而且还要重写hashcode方法。这边的String类型已经重写了hashcode方法和equals方法。自定义的类型都要重写equals。至于要不要重写hashCode,看你是否实现的hash的接口,或者你继承的父类是不是实现了,不是,不用重写。是就要重写。
要重写hashCode方法主要是源码里调用了hash方法的。
Hashmap;可以看见containsKey有hash
public boolean containsKey(Object key) {
return getNode(hash(key), key) != null;
}public synchronized boolean contains(Object value) {
if (value == null) {
throw new NullPointerException();
}
Entry<?,?> tab[] = table;
for (int i = tab.length ; i-- > 0 ;) {
for (Entry<?,?> e = tab[i] ; e != null ; e = e.next) {
if (e.value.equals(value)) {
return true;
}
}
}
return false;
}HashSet:也有hash方法
public boolean containsKey(Object key) {
return getNode(hash(key), key) != null;
}ArrayList;并没有调用hash方法,indexOf同样也没有调用
public boolean contains(Object o) {
return indexOf(o) >= 0;
}举报