Java中的哈希码是怎样通过其属性或是地址计算得到的?(自学版)

在 Java 中,哈希码(hash code)的计算方式取决于具体的对象类型。默认情况下, Object 类的 hashCode 方法会返回对象的内存地址经过处理后的结构,但一般会根据对象的属性来重写 hashCode 方法,以满足特定的需求。
 
以下是一些常见的计算哈希码的方式:

  1.  Object 类的默认 hashCode :返回对象的内存地址经过处理后的结构,由于每个对象的内存地址都不一样,所以哈希码也不一样。
  2. String 类的 hashCode :根据 String 类包含的字符串的内容,通过一种特殊算法返回哈希码,只要字符串所在的堆空间相同,返回的哈希码也相同。
  3.  Integer 类:返回的哈希码就是 Integer 对象里所包含的那个整数的数值,例如 Integer i1 = new Integer(100) , i1.hashCode() 的值就是 100。

 
如果自定义类,通常需要根据类的属性来重写 hashCode 方法,以确保具有相同属性值的不同对象能够得到相同的哈希码。重写 hashCode 方法时,需要遵循一定的原则,例如:
如果两个对象通过 equals 方法比较是相等的,那么它们的哈希码必须相等;如果两个对象通过 equals 方法比较是不相等的,那么它们的哈希码可以相等也可以不相等。

以下是一个自定义类重写 hashCode 方法的示例:

public class Person {
    private String name;
    private int age;

    // 构造方法、getter 和 setter 方法等省略

    @Override
    public int hashCode() {
        int result = 17;
        result = 31 * result + name.hashCode(); 
        result = 31 * result + age; 
        return result;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null || getClass()!= obj.getClass()) {
            return false;
        }
        Person other = (Person) obj;
        return name.equals(other.name) && age == other.age;
    }
}


在上述示例中,重写了 hashCode 方法,计算哈希码时综合考虑了 name 和 age 属性的值。通过使用乘法(乘以 31)和加法等运算,生成一个相对唯一的哈希码,以确保具有相同 name 和 age 属性值的不同 Person 对象具有相同的哈希码。
 
这样做的目的通常是为了在一些依赖哈希码的数据结构(如 HashSet 、 HashMap 等)中,能够正确地进行元素的存储、查找和比较等操作,提高数据处理的效率和准确性。同时,在重写 hashCode 方法时,也需要确保 equals 方法的逻辑与 hashCode 方法的计算保持一致,以满足上述的哈希码原则。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值