HashMap如何查询对象?
内部通过空间换时间的方法,用一个大数组存储所有value,并根据key直接计算出value应该存储在哪个索引
对比Key:用.equals()方法,如果key是String则已经有了它自己的equals(),但如果是我们自己的Class 就要重新写
计算key:调用key对象的hashcode()方法,返回一个int - 即 index of the value, 然后返回value
正确的HashMap应当满足以下条件
- 作为key的对象必须正确覆写equals()方法,相等的两个key实例调用equals()必须返回true;
- 作为key的对象还必须正确覆写hashCode()方法,且hashCode()方法要严格遵循以下规范:
如果两个对象相等,则两个对象的hashCode()必须相等;
如果两个对象不相等,则两个对象的hashCode()尽量不要相等。- 可以保证查询效率, 若不同对象返回相同hashcode会导致Map内部存储冲突,使存取效率下降
编写equals()
public boolean equals(Object o) { if (o instanceof Person) { Person p = (Person) o;//downcast return Objects.equals(this.name, p.name) && this.age == p.age;//用Object.equals()就不用手动写null的情况了 } return false; }
正确覆写 hashCode方法: (能避免 firstName或lastName为null的情况)
int hashCode() { return Objects.hash(firstName, lastName, age); }