为啥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; }
举报