`
mywebcode
  • 浏览: 1000624 次
文章分类
社区版块
存档分类
最新评论

重载equals方法就一定要要重载hashCode方法

 
阅读更多
HashCode 和 equal方法重载

1、 为什么要重载equal方法?

答案:因为Object的equal方法默认是两个对象的引用的比较,意思就是指向同一内存,地址则相等,否则不相等;如果你现在需要利用对象里面的值来判断是否相等,则重载equal方法。

2、 为什么重载hashCode方法?

答案:一般的地方不需要重载hashCode,只有当类需要放在HashTable、HashMap、HashSet等等hash结构的集合时才会重载hashCode,那么为什么要重载hashCode呢?就HashMap来说,好比HashMap就是一个大内存块,里面有很多小内存块,小内存块里面是一系列的对象,可以利用hashCode来查找小内存块hashCode%size(小内存块数量),所以当equal相等时,hashCode必须相等,而且如果是object对象,必须重载hashCode和equal方法。

3、 为什么equals()相等,hashCode就一定要相等,而hashCode相等,却不要求equals相等?

答案:1、因为是按照hashCode来访问小内存块,所以hashCode必须相等。

<wbr style="font-family:simsun; font-size:14px; line-height:21px"><span style="font-family:simsun; font-size:14px; line-height:21px"></span><wbr style="font-family:simsun; font-size:14px; line-height:21px"><span style="font-family:simsun; font-size:14px; line-height:21px"></span><wbr style="font-family:simsun; font-size:14px; line-height:21px"><span style="font-family:simsun; font-size:14px; line-height:21px"></span><wbr style="font-family:simsun; font-size:14px; line-height:21px"><span style="font-family:simsun; font-size:14px; line-height:21px"></span><wbr style="font-family:simsun; font-size:14px; line-height:21px"><span style="font-family:simsun; font-size:14px; line-height:21px"></span><wbr style="font-family:simsun; font-size:14px; line-height:21px"><span style="font-family:simsun; font-size:14px; line-height:21px"></span><wbr style="font-family:simsun; font-size:14px; line-height:21px"><span style="font-family:simsun; font-size:14px; line-height:21px"></span><wbr style="font-family:simsun; font-size:14px; line-height:21px"><span style="font-family:simsun; font-size:14px; line-height:21px"></span><wbr style="font-family:simsun; font-size:14px; line-height:21px"><span style="font-family:simsun; font-size:14px; line-height:21px"></span><wbr style="font-family:simsun; font-size:14px; line-height:21px"><span style="font-family:simsun; font-size:14px; line-height:21px"></span><wbr style="font-family:simsun; font-size:14px; line-height:21px"><span style="font-family:simsun; font-size:14px; line-height:21px">2、HashMap获取一个对象是比较key的hashCode相等和equal为true。</span><br style="font-family:simsun; font-size:14px; line-height:21px"><br style="font-family:simsun; font-size:14px; line-height:21px"><span style="font-family:simsun; font-size:14px; line-height:21px">之所以hashCode相等,却可以equal不等,就比如ObjectA和ObjectB他们都有属性name,那么hashCode都以name计算,所以hashCode一样,但是两个对象属于不同类型,所以equal为false。</span><br style="font-family:simsun; font-size:14px; line-height:21px"><br style="font-family:simsun; font-size:14px; line-height:21px"><span style="font-family:simsun; font-size:14px; line-height:21px">4、 为什么需要hashCode?</span><br style="font-family:simsun; font-size:14px; line-height:21px"><br style="font-family:simsun; font-size:14px; line-height:21px"><span style="font-family:simsun; font-size:14px; line-height:21px">1、 通过hashCode可以很快的查到小内存块。</span><br style="font-family:simsun; font-size:14px; line-height:21px"><span style="font-family:simsun; font-size:14px; line-height:21px">2、 通过hashCode比较比equal方法快,当get时先比较hashCode,如果hashCode不同,直接返回false。</span><br style="font-family:simsun; font-size:14px; line-height:21px"><br style="font-family:simsun; font-size:14px; line-height:21px"><span style="font-family:simsun; font-size:14px; line-height:21px"></span><wbr style="font-family:simsun; font-size:14px; line-height:21px"><br style="font-family:simsun; font-size:14px; line-height:21px"><br style="font-family:simsun; font-size:14px; line-height:21px"><span style="font-family:simsun; font-size:14px; line-height:21px"></span><wbr style="font-family:simsun; font-size:14px; line-height:21px"><br style="font-family:simsun; font-size:14px; line-height:21px"><br style="font-family:simsun; font-size:14px; line-height:21px"><span style="font-family:simsun; font-size:14px; line-height:21px">以下是一个具体类的实例代码:</span><br style="font-family:simsun; font-size:14px; line-height:21px"><br style="font-family:simsun; font-size:14px; line-height:21px"></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
public class Person
{
 private String name;
 private int age;

 @Override
 public int hashCode()
 {
  final int prime = 31;
  int result = 1;
  result = prime * result + age;
  result = prime * result + ((name == null) ? 0 : name.hashCode());
  return result;
 }

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


分享到:
评论

相关推荐

    廖雪峰 Java 教程.doc

    编写equals和hashCode 使用EnumMap 使用TreeMap 使用Properties 使用Set 使用Queue 使用PriorityQueue 使用Deque 使用Stack 使用Iterator 使用Collections IO File对象 InputStream OutputStream ...

    Java基础总结

    为什么要重写hashCode方法?3. String s1 = new String(“abc”); String s2 = “abc”; s1 == s2? 语句1在内存中创建了几个对象?4. String为什么是不可变的?jdk源码中的String如何定义的?为什么这么设计?4. 请...

    java面试常见问题(超详细).pdf

    Java中的equals方法和hashCode方法有什么关系? Java中什么是重载【Overloading】?什么是覆盖【Overriding】?它们有什么区别? Java中什么是多态?如何实现多态? Java中什么是接口?它有什么作用? Java中什么是...

    java 多线程 生产者消费者模式源码

    java 多线程 生产者消费者模式,多个生产者对多个消费者,使用jdk 线程池及 BlockingQueue实现,解决了待生产的任务生产完成后,正常终止所有线程,避免...源码中还简单介绍了如何重载equals及hashCode。适合初学线程者

    涵盖了90%以上的面试题

    为什么重写equals还要重写hashCode? 介绍一下volatile jdk1.5新特性 jdk1.7新特性 jdk1.8新特性 java语言有哪些优点? 同一个.java文件中是否可以有多个main方法 一个".java"源文件中是否可以包括多个类(不是内部类...

    Java入门教程(微学苑)-part1

    最好的最简单的Java入门教程。 目录 1 Java概述 1 1.1 Java语言概述 1 1.2 Java虚拟机以及跨平台原理 2 1.3 关于JVM的执行效率 2 1.4 客户端市场的折戟 3 ...4.22 hashCode() 方法 80 4.23 toString() 方法 80

    【05-面向对象(下)】

    •final 修饰的方法仅仅是不能重写,但它完全可以被重载。 •final 修饰的类不可以被继承 不可变的类 •不可变的类要满足以下几个条件:  –1.使用private和final修饰符来修饰该类的属性  –2....

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    7.5 方法重载(overload):给汽车加速添个限制 168 7.5.1 什么是方法的签名 168 7.5.2 什么是重载?为什么要重载? 168 7.5.3 给汽车加个重载的方法 169 7.5.4 测试一下 169 7.5.5 重载容易引发误解的两个地方...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    7.5 方法重载(overload):给汽车加速添个限制 168 7.5.1 什么是方法的签名 168 7.5.2 什么是重载?为什么要重载? 168 7.5.3 给汽车加个重载的方法 169 7.5.4 测试一下 169 7.5.5 重载容易引发误解的两个地方...

    Java面试经典题,对JAVA面试很有帮助

    7.重载和重写的区别 8.equals与==的区别 9.Hashcode的作用 10.String、String StringBuffer 和 StringBuilder 的区别是什 么? 11.ArrayList和linkedList的区别 12.HashMap和HashTable的区别 13.Collection包结构,与...

    见面试官前,掏出来看看系列(三)之——JavaSE思维导图(持续更新中……)

    IO)容器Map面向对象技术重载和覆盖的区别面向对象的特征字符串和数组字符串创建与存储的机制”==“、equals()和hashCode有什么区别String、StringBuffer、StringBuilder和StringTokenizer的区别在java中的数组...

    leetcode题库-java-interview:Java研发基础相关

    重载与重写的区别 访问控制符 Object类方法 抽象类与接口 类初始化顺序 hashCode & equals == & equals this static 基本类型 & 包装类 String 泛型 内部类 集合类 ArrayList & LinkedList 详解 HashMap HashTable ...

    javaSE代码实例

    14.6.3 equals与hashCode方法重写规定的作用 288 14.6.4 LinkedHashSet类的使用 291 14.6.5 SortedSet接口与TreeSet类 292 14.6.6 自定义满足Sorted集合的类 293 14.6.7 定制SortedSet的排序规则 296 14.6...

    JAVA面试常见问题整理

    接着,文章详细解释了equals和hashCode的用法及区别,以及String、StringBuffer、StringBuilder的区别和适用场景。 此外,文章还涵盖了Java中的一些基本概念,如final、interface、abstract类、重载和重写等。同时...

    疯狂JAVA讲义

    学生提问:hashCode方法对于HashSet的作用是什么? 249 7.3.2 TreeSet类 252 7.3.3 EnumSet类 259 7.4 List接口 261 7.4.1 List接口和ListIterator接口 261 7.4.2 ArrayList和Vector实现类 264 7.4.3 固定长度...

    JAVA基础课程讲义

    equals和hashcode方法 143  泛型 144 思考作业 145 上机作业 145 第八章 IO技术 146 为什么需要学习IO技术 146 基本概念 146 数据源 146 流的概念 146 第一个简单的IO流程序及深入(将文件中的数据读入) 146 Java...

    大华股份java笔试题-interviewer:面试官

    大华股份java笔试题 第一章 内容介绍 第二章 JavaSE 基础 一、 Java 面向对象 面向对象都有哪些特性以及你对这些特性的理解 访问权限修饰符 public、private、...重载的方法能否根据返回类型进行区分?(2017-1

    安卓java读取网页源码-questions:自问自答

    equals 和 hashCode 有什么区别 说说你对 final 修饰符的理解 说说你对泛型的理解 泛型中 extends 和 super 的区别 描述下 Java 中的异常处理机制 什么是 HashMap,描述下其实现原理 HashMap、Hashtable 和 HashSet ...

Global site tag (gtag.js) - Google Analytics