hashCode()和equals()方法的重要性的学习笔记


前言

每日一题,学习笔记

hashCode()和equals()方法的重要性体现在什么地方?


一、hashCode()是什么?

Java hashCode() 方法

hashCode() 方法用于返回字符串的哈希码。
字符串对象的哈希码根据以下公式计算:

s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

使用 int 算法,这里 s[i] 是字符串的第 i 个字符的 ASCII 码,n 是字符串的长度,^ 表示求幂。空字符串的哈希值为 0。

语法
public int hashCode()
参数
返回值

返回对象的哈希码值。

实例
public class Test {
        public static void main(String args[]) {
                String Str = new String("www.runoob.com");
                System.out.println("字符串的哈希码为 :" + Str.hashCode() );
        }
}

以上的结果

字符串的哈希码为 :321005537

二、equals()是什么?

equals() 方法用于判断 Number 对象与方法的参数进是否相等。

语法
public boolean equals(Object o)
参数

o – 任何对象。

返回值

如 Number 对象不为 Null,且与方法的参数类型与数值都相等返回 True,否则返回 False。
Double 和 Float 对象还有一些额外的条件,可以参阅 API 手册:JDK 1.6。

实例
public class Test{
        public static void main(String args[]){
                Integer x = 5;
                Integer y = 10;
                Integer z =5;
                Short a = 5;

                System.out.println(x.equals(y));  
                System.out.println(x.equals(z));
                System.out.println(x.equals(a));
        }
}

编译结果为

false
true
false

三、hashcode()和equals()比较:

hashCode()方法和equal()方法的作用其实一样,在Java里都是用来对比两个对象是否相等一致,那么equal()既然已经能实现对比的功能了,为什么还要hashCode()呢?
因为重写的equal()里一般比较的比较全面比较复杂,这样效率就比较低,而利用hashCode()进行对比,则只要生成一个hash值进行比较就可以了,效率很高,那么hashCode()既然效率这么高为什么还要equal()呢?
因为hashCode()并不是完全可靠,有时候不同的对象他们生成的hashcode也会一样(生成hash值得公式可能存在的问题),所以hashCode()只能说是大部分时候可靠,并不是绝对可靠,所以我们可以得出:
1.equal()相等的两个对象他们的hashCode()肯定相等,也就是用equal()对比是绝对可靠的。
2.hashCode()相等的两个对象他们的equal()不一定相等,也就是hashCode()不是绝对可靠的。

四、hashcode()和equals()关系总结

  • 第一种 不会创建“类对应的散列表”
    这里所说的“不会创建类对应的散列表”是说:我们不会在HashSet, Hashtable, HashMap等等这些本质是散列表的数据结构中,用到该类。例如,不会创建该类的HashSet集合。
    在这种情况下,该类的“hashCode() 和 equals() ”没有半毛钱关系的!
    这种情况下,equals() 用来比较该类的两个对象是否相等。而hashCode() 则根本没有任何作用,所以,不用理会hashCode()。
  • 第二种 会创建“类对应的散列表”
    这里所说的“会创建类对应的散列表”是说:我们会在HashSet, Hashtable, HashMap等等这些本质是散列表的数据结构中,用到该类。

总结

Java中的HashMap使用hashCode()和equals()方法来确定键值对的索引,当根据键获取值的时候也会用到这两个方法。如果没有正确的实现这两个方法,两个不同的键可能会有相同的hash值,因此,可能会被集合认为是相等的。而且,这两个方法也用来发现重复元素。所以这两个方法的实现对HashMap的精确性和正确性是至关重要的。

菜鸟
Axe_Lai
由菜鸟机场与作者:Axe_Lai提供技术支持(侵联删)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值