参考的优秀文章:

《Java编程思想》第四版

《Effective Java》第二版

 

Map接口是映射表的结构,维护键对象与值对象的对应关系,称键值对

 

> hashcode()和equals()

hashcode()和equals()即用于识别对象的身份

在HashMap或类似的实现中,查找一个对象,是通过hashcode()返回的散列值映射到一个范围内的下标,在通过equals()比较此下标连接的链表是否存在相同的对象。

简单来说,hashcode()用于参考、快速定位(缩减范围),真正是否等于是依赖equals()。

 

默认的hashcode()equals()

如何对象没有覆盖这两个方法,那么就是继承Object对象的。

Object中,hashcode()是使用对象的地址计算散列值;equals()只比较对象的地址

 

必要的时候,我们需要覆盖这两个方法。

覆盖这两个方法有什么原则呢?

equals()的覆盖,主要是基于此对象的业务。

而hashcode()的覆盖原则,详情可参见《Effective Java》的“覆盖equals时总要覆盖hashcode”一节。

有几个比较重要的原则:

1、两个equals相等的对象,其hashcode是相等的。

2、两个equals不等的对象,其hashcode有可能是相等的。

3、好的hashcode()应产生分布均匀的散列码。

 

基于第3点,《Effective Java》有具体的建议。

1、定义变量result为非零的数。

2、用公式result = 31 * result + c,其中c是类中各个域的散列值。

用Eclipse生成的hashcode()与此原则类似,我们可以看看:

public class User {
    
    private Integer id;
    private String name;
    private boolean flag = false;
    private long phoneNumber;
    
    @Override
    public int hashCode() {
        final int prime = 31;
        int result = 1;
        result = prime * result + (flag ? 1231 : 1237);
        result = prime * result + ((id == null) ? 0 : id.hashCode());
        result = prime * result + ((name == null) ? 0 : name.hashCode());
        result = prime * result + (int) (phoneNumber ^ (phoneNumber >>> 32));
        return result;
    }
    
    @Override
    public boolean equals(Object obj) {
        if (this == obj)
            return true;
        if (obj == null)
            return false;
        if (getClass() != obj.getClass())
            return false;
        User other = (User) obj;
        if (flag != other.flag)
            return false;
        if (id == null) {
            if (other.id != null)
                return false;
        } else if (!id.equals(other.id))
            return false;
        if (name == null) {
            if (other.name != null)
                return false;
        } else if (!name.equals(other.name))
            return false;
        if (phoneNumber != other.phoneNumber)
            return false;
        return true;
    }
    
        

}
View Code

相关文章:

  • 2022-12-23
  • 2021-09-11
  • 2021-06-24
  • 2022-01-09
  • 2022-12-23
  • 2021-07-23
  • 2021-08-11
  • 2021-09-08
猜你喜欢
  • 2022-01-16
  • 2021-10-29
  • 2021-06-24
  • 2021-06-24
  • 2022-12-23
  • 2021-12-04
  • 2021-10-04
相关资源
相似解决方案