8.key value是否可为null
TreeMap的key不为null的原因:Comparable和Comparator都需要key不为null。
在任何Map集合中,都要尽量避免KV设置为null值。
9.元素比较
- 比较大小
Comparable接口 —— compareTo方法
Comparator接口 —— compare方法
用在排序中,例如Arrays.sort() - 比较对象是否相等
hashCode若相同,还需调用equals来进行区分。
若equals相等,则hashCode返回相等,任何时候覆盖equals,则必覆盖hashCode()。
逆反命题:若hashCode不等,则equals必不相等
if (p.hash == hash &&
((k = p.key) == key || (key != null && key.equals(k))))
- HashMap使用hashCode/equals
TreeMap使用Comparable/Comparator接口 - 来看看String的hashCode/equals
hashCode是使用val值进行计算的,所以只要equals,则hashCode一定相等。
public int hashCode() {
int h = hash;
if (h == 0 && value.length > 0) {
char val[] = value;
for (int i = 0; i < value.length; i++) {
h = 31 * h + val[i];
}
hash = h;
}
return h;
}
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
if (anObject instanceof String) {
String anotherString = (String)anObject;
int n = value.length;
if (n == anotherString.value.length) {
char v1[] = value;
char v2[] = anotherString.value;
int i = 0;
while (n-- != 0) {
if (v1[i] != v2[i])
return false;
i++;
}
return true;
}
}
return false;
}