HashMap如何查询对象?

内部通过空间换时间的方法,用一个大数组存储所有value,并根据key直接计算出value应该存储在哪个索引
对比Key:用.equals()方法,如果key是String则已经有了它自己的equals(),但如果是我们自己的Class 就要重新写
计算key:调用key对象的hashcode()方法,返回一个int - 即 index of the value, 然后返回value

正确的HashMap应当满足以下条件

  1. 作为key的对象必须正确覆写equals()方法,相等的两个key实例调用equals()必须返回true;
  2. 作为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);
}