1.为什么要重写hashCode方法?

当自己要新建一个class,并要把这个类放到HashMap的时候,需要覆写这两个办法。如果不覆写,放入两个新的对象,可能会是不相等的。

在java的集合中,判断两个对象是否相等的规则是:

  • 首先,判断两个对象的hashCode是否相等
  • 如果不相等,认为两个对象也不相等
  • 如果相等,则判断两个对象用equals运算是否相等
    • 如果不相等,认为两个对象也不相等
    • 如果相等,认为两个对象相等

2.核心注意

  1. equals()相等的两个对象,hashcode()一定相等;
  2. equals()不相等的两个对象,却并不能证明他们的hashcode()不相等。

3.Override

假设class有下面3个成员变量:

  • private Object property1;
  • private Object property2;
  • private Object property3;

    ```java

    @Override

    public int hashCode() {

    int result = 17;

    result = result * 37 + property1.hashcode;

    result = result * 37 + property2.hashcode;

    result = result * 37 + property3.hashcode;

    return result;

    }

@Override

public boolean equals(Object obj) {

if (this == obj)

return true;

if (obj == null)

return false;

if (obj instanceof Point) {

Point p = (Point) obj;

if (this.x == p.x && this.y == p.y)

return true;

}

return false;

}

```

想更好的实现还可以使用Apache Commons Lang包来重写hashCode()equals()方法。

4.为什么还要设计hashcode()方法,一个equals()不就足够了吗?

只要一个equals()方法肯定可以保证代码的执行,但是这样做却忽略了一个重要指标–——效率

  • hashcode()的存在可以大大地提升效率。试想,如果仅使用equals()方法,在往一个HashSet中添加元素的时候,需要将这个元素与HashSet中的每个元素进行euqals()比较,时间为O(N),
  • 而如果使用hashcode()方法,根据该元素的hashcode值,可以直接定位到它的位置,
  • 如果该位置没有元素,则直接插入(equals()肯定不相等),否则,再使用equals()对比,相等则丢弃,不必插入,不相等则可以使用其他方法(如向后移动一位等),时间复杂度降至O(1)。

想想HashMap的get()方法是如何工作的。

因此,重写equals()方法总是要重写hashcode(),请务必遵守。

覆写hashCode equal方法的更多相关文章

  1. [改善Java代码]覆写equals方法必须覆写hashCode方法

    覆写equals方法必须覆写hashCode方法,这条规则基本上每个Javaer都知道,这也是JDK API上反复说明的,不过为什么要这样做呢?这两个方法之间有什么关系呢?本建议就来解释该问题,我们先 ...

  2. java覆写hashcode方法

    覆写hashcode 1. 把某个非零常数值,例如17,保存在int变量result中: 2. 对于对象中每一个关键域f(指equals方法中考虑的每一个域): 3, boolean型,计算(f? 0 ...

  3. 为什么覆写equals()方法的时候总是要覆写hashcode()?

    要回答这个问题,我们应该先认识一下obj中的equals和hascode方法 1.equals()方法在obj中定义如下: public boolean equals(Object obj) { re ...

  4. 覆写equals方法为什么需要覆写hashCode方法

    覆写equals方法必须覆写hashCode方法,是JDK API上反复说明的,不过为什么要这样做呢?这两个方法之间有什么关系呢? void test() { // Person类的实例作为Map的k ...

  5. 使用第三方工具覆写Object中方法

    我们在实际开发中,经常需要覆写Object中的equals,hashcode,toString方法,其实编写这些代码并不是很难,但很枯燥和乏味. 下面推荐Google的Guava jar包来覆写上面的 ...

  6. 为什么覆写equals必须要覆写hashCode?

    ============================================= 原文链接: 为什么覆写equals必须要覆写hashCode? 转载请注明出处! ============= ...

  7. (强制)要求覆写equals必须覆写hashCode(原理分析)

    hashCode和equals hashCode和equals用来标识对象,两个方法协同工作可用来判断两个对象是否相等.众所周知,根据生成的哈希将数据散列开来,可以使存取元素更快.对象通过调用Obje ...

  8. [改善Java代码]覆写变长方法也循规蹈矩

    建议6:覆写变长方法也循规蹈矩 在Java中,子类覆写父类中的方法很常见,这样做既可以修正Bug也可以提供扩展的业务功能支持,同时还符合开闭原则(Open-Closed Principle),我们来看 ...

  9. hashcode(),equal()方法深入解析

    首先,想要明白hashCode的作用,必须要先知道Java中的集合. 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set. 前者集合内的元素是有序的,元素可以重 ...

随机推荐

  1. 用PS给图标添加外发光效果

    最近在做app的时候用到了图标需要根据点击和非点击显示两种状态(原始状态和外发光状态). 如下图: 没办法,因为这是毕业设计的东西,总不能叫同事帮忙处理下.所以自己充当了回美工. 做法如下: 1.打开 ...

  2. angular中的$http配置和参数

    依赖:$httpBackend $cacheFactory $rootScope $q $injector 使用:$http(config); 参数: method:字符串,请求方法. url:字符串 ...

  3. iOS开发 missing iOS distribution signing identity for 。。。

    苹果真是不让人省心,新年一来上传APP,就出现Missing iOS Distribution signing indetity for xxx 于是就把证书删了做,做了删了再重做,还是不行 百度了一 ...

  4. SGU 194 Reactor Cooling ——网络流

    [题目分析] 无源汇上下界可行流. 上下界网络流的问题可以参考这里.↓ http://www.cnblogs.com/kane0526/archive/2013/04/05/3001108.html ...

  5. jquery为某div下的所有textbox的赋值

    html代码 <input type="button" value="变量div_Alltext中的变量" onclick="Do_DivAll ...

  6. node.js 下依赖Express 实现post 4种方式提交参数

    上面这个图好有意思啊,哈哈, v8威武啊.... 在2014年的最后一天和大家分享关于node.js 如何提交4种格式的post数据. 上上一篇说到了关于http协议里定义的4种常见数据的post方法 ...

  7. NSString总结

    [from]http://www.jianshu.com/p/7994b0ad6b88 问题:NSString到底是不是字符串? NSString 是 OC中专门处理字符串的对象!提供了转换大小写,拼 ...

  8. EntityFrameWork分页

    EF分页代码 using System; using System.Collections.Generic; using System.Linq; using System.Web; using Sy ...

  9. Eclipse配置Git发布项目到Github

    很牛叉的博客http://blog.csdn.net/luckarecs/article/details/7427605 一.安装插件 菜单栏Help --> Install New Softw ...

  10. java_web学习(15)jQuery

    JavaScript 库作用及对比 为了简化 JavaScript 的开发, 一些 JavsScript 库诞生了. JavaScript 库封装了很多预定义的对象和实用函数.能帮助使用者建立有高难度 ...