自己学到这,就记录了下来,代码都是自己敲得,有不对的地方希望大神指点出来
为什么重写 equals 方法 必须重写 hashCode
  如果你重写了equals,比如说是基于对象的内容实现的,而不重写 HashCode,那么很可能某两个对象明明是“相等”,而hashCode却不一样.那么就会返回 false。例如在 HashSet 集合中,不允许存在相同元素,但是当你 new 两个对象,对象内容相同时,在 HashSet 集合中就存在了相同的两个元素,如何解决这个问题?那就要重写 equals 方法,但是重写 equals 方法还不能解决问题,因为在 HashSet 中判断两个元素是否相等是首先判断 hashCode 内存地址是否相等,如果不等在用 equals 方法判断内容是否相等,由于 new 了两个对象,虽然内容相同,但是在内存中开辟两两块地址,hashCode 肯定不同,所以还要重写 hashCode 方法。
 
下面是代码说明
public class Person {
//随便定义个类
  private int id;
  private String name;
  private int age;
  //set get 方法
  public int getId() {
    return id;
  }
  public void setId(int id) {
    this.id = id;
  }
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
   public int getAge() {
    return age;
  }
  public void setAge(int age) {
    this.age = age;
  }
  //构造方法
  public Person(int id,String name, int age) {
    this.id=id;
    this.name = name;
    this.age = age;
  }
  //重写 hashCode 方法
  public int hashCode() {
    return this.getId();
  }
  //重写 equals 方法
  public boolean equals(Object obj) {
    if(this==obj){
      return true;
    }
    if(obj instanceof Person){
      if(this.getId()==((Person) obj).getId()){
        return true;
      }
    }
    return false;
  }
}
 
  测试类中代码
  //实例化
  Person p1 = new Person(1,"张三",12);
  Person p2 = new Person(1,"张三",12);
  // 声明 HashSet 集合类
  HashSet<Person> h = new HashSet<Person>();
  //添加数据
  h.add(p1);
  h.add(p2);
  //遍历集合
  for(Person per :h){
    System.out.println(per.getName());
  }
 
不重写 equals 和 hashCode 方法的执行结果
只重写 equals 方法的执行结果
重写 equals 和 hashCode 方法的执行结果
 

为什么重写 equals 方法 必须重写 hashCode的更多相关文章

  1. 为什么重写equals方法还要重写hashcode方法?

    我们都知道Java语言是完全面向对象的,在java中,所有的对象都是继承于Object类.Ojbect类中有两个方法equals.hashCode,这两个方法都是用来比较两个对象是否相等的. 在未重写 ...

  2. Java 深度克隆 clone()方法重写 equals()方法的重写

    1.为什么要重写clone()方法? 答案:Java中的浅度复制是不会把要复制的那个对象的引用对象重新开辟一个新的引用空间,当我们需要深度复制的时候,这个时候我们就要重写clone()方法. 2.为什 ...

  3. 讲解:为什么重写equals时必须重写hashCode方法

    一 :string类型的==和equals的区别: 结论:"=="是判断两个字符串的内存地址是否相等,equals是比较两个字符串的值是否相等,具体就不做扩展了,有兴趣的同学可以去 ...

  4. java中为什么重写equals时必须重写hashCode方法?

    在上一篇博文Java中equals和==的区别中介绍了Object类的equals方法,并且也介绍了我们可在重写equals方法,本章我们来说一下为什么重写equals方法的时候也要重写hashCod ...

  5. java重写equals方法

    @Override public int hashCode() { return task.getId(); } @Override public boolean equals(Object obj) ...

  6. java重写equals方法需要注意的几点

    为什么equals()方法要重写? 判断两个对象在逻辑上是否相等,如根据类的成员变量来判断两个类的实例是否相等,而继承Object中的equals方法只能判断两个引用变量是否是同一个对象.这样我们往往 ...

  7. Java重写equals方法(重点讲解)

    为什么equals()方法要重写? 判断两个对象在逻辑上是否相等,如根据类的成员变量来判断两个类的实例是否相等,而继承Object中的equals方法只能判断两个引用变量是否是同一个对象.这样我们往往 ...

  8. java 中为什么重写 equals 后需要重写 hashCode

    本文为博主原创,未经允许不得转载: 1. equals 和 hashCode 方法之间的关系 这两个方法都是 Object 的方法,意味着 若一个对象在没有重写 这两个方法时,都会默认采用 Objec ...

  9. C#中在比较自定义对象的时候要重写Equals方法

    using System;using System.Collections.Generic;using System.Text; namespace Equal{    using System; c ...

随机推荐

  1. 正则表达式获取body内容

    最近项目需要,要弄个正则表达式获取body的内容. 用过angularjs就知道,很多时候要写指令时引用templateUrl的时候.template的内容root是不能包含多个节点的,否则就报错. ...

  2. javascript精度问题与调整

    一个经典的问题: 0.1+0.2==0.3 答案是:false 因为:0.1+0.2=0.30000000000000004 第一次看到这个结果就是无比惊讶,下巴碰到地上,得深入了解下问题出在哪里,该 ...

  3. (转载)KMP算法讲解

    网上找到了一篇详细讲解KMP字符串匹配算法,质量很高.特备忘于此. 摘自:http://blog.csdn.net/v_july_v/article/details/7041827 实现代码如下: / ...

  4. English - Green Peanut Butter

    There is a guy. He wants to drink 12 cups of green peanut butter. He needs green peanut butter. So h ...

  5. 第二章:2.3 验证Django安装成功

    检查 Django 是否安装成功步骤如下: 1. 在dos 命令行中进入python环境: 2. 在python环境下面输入: import django     # 导入django 的包 djan ...

  6. Java基础语法<八> 继承

    1.超类和子类 超类和子类 父类与子类 多态: 一个对象变量可以指示多种实际类型的现象称为多态 一个变量可以引用父类对象,也可以引用其子类对象,这就是多态. 不能将一个超类的引用赋给子类变量,因为调用 ...

  7. Java 数据类型在实际开发中应用二枚举

    在实际编程中,往往存在着这样的"数据集",它们的数值在程序中是稳定的,而且"数据集"中的元素是有限的.在JDK1.5之前,人们用接口来描述这一种数据类型. 1. ...

  8. 配置ssh免密码登录——集群学习日记

    度过了难熬的考试月时期之后,最近和小伙伴一起参加的的比赛进入了紧张的准备时期.在进行工作的时候,发现有很多基础的知识点,自己不是很清楚以及了解,所以在想,要不就边学习的时候边写下学习日记,以供自己后来 ...

  9. linux 的一些脑洞操作

    把当前文件夹的文件名用","连接成一行,或者将多行转变为一行 ls | paste -s -d "," # -s 选项将输入进行一次性粘贴 ls | xargs ...

  10. JavaScript-DOM编程的一些常用属性

    一.Document常见属性 document.title // 设置文档标题等价于HTML的title标签 document.bgColor // 设置页面背景色 document.fgColor ...