首先记住两句话

相等的两个对象,即equals(Object)方法判断两个对象相等,那么他们必须要有相同的hashcode

hashcode相同的两个对象,他们可能相同,也可能不相同

简单地说可以这么理解,hashcode是java实现中经常用到的比如在HashMap HashSet,根据hashcode不等就可以断定两个对象不等,如果相等再去比较equals,大大减少了equals的调用次数,效率就高很多了

原理搜一下有很多文章,不再多说

重点说一下应用,大家或许看到很多地方说:

重写equals方法要同步重写hashcode,具体的怎么写却不知道

接下来就主要说一下,具体的怎么实现(小白围观,老鸟勿扰)

其实开场的两句话也是这个意思

场景:

当你需要实现你自己的对象上的逻辑相等时,需要重写equals方法

比如一个学生类

name,age,sex,class…等多重属性

假设就是public student{   //这么一个类

name

age

sex

class

}

(简写一下,不要较真…)

用自然语言说的话,就是姓名,性别,年龄,班级一样,在这个类上的话,我们就可以认为两个对象是相等的了

对吧

换成java语言就是

public boolean equals(Object obj) {

if (obj instanceof Student) {
Student student= (Student ) obj;
if(this.name.equals(student.name) && this.age.equals(student.age)
                     &&this.sex.equals(student.sex)&&this.class.equals(student.class)        ){

                return true;
}
else{
return false;
}
//非该类实例,直接返回false
} else{ return false;
} }

很简单,比较相等,至少得是学生..不是直接返回false

如果是学生实例,就比较一下,姓名年龄性别班级,都相等了就是相等了

怎么保障重写equals方法后,这两个对象实例的hashcode也是一样的呢?

所有的hashcode都返回一样的值?答案是可以的在某些情况下,但是某些情况下你就要悲剧了,所以当然不要

常用的办法是用:判断相等的条件  用到的属性  来重写

直白点就是:利用刚才使用到的姓名 性别 年龄 班级 这几个属性的值来重写hashcode

使用它们的组合方式

可以使用这样子的形式

a1*属性1的int形式+a2 属性2的int形式+….

a为系数

所谓属性的int形式,大家要知道hashcode都是数值

这样子才能保障最后的结果也是一个int值,简单就这么理解吧

而且还有就是比如string已经有了他自己的hashcode实现了,可以直接调用的

比如我们的例子

我们可以这样子

public int hashCode() {
// TODO Auto-generated method stub
//根据判断是否相等的属性,来重写hashCode
return ( this.name.hashCode() + this.sex.hashCode()+age+this.class.hashcode() ); }

系数可以随便,你甚至都可以用this.name.hashCode() *age

形式上可以变化多端

但是要注意几个条件就好了

1,相同的对象的hashcode肯定是相同的

2,最后生成的结果不能大于int的取值范围

3,尽可能的科学保证不是随随便便的一个对象hashcode都相等

友情提示:

[1]. HashSet判断删除添加元素等操作依据的是被操作元素所在的类的hashCode()equals( )这两个方法。

[2]. ArrayList做同等的操作,依据的仅仅是equals( )方法

正确重写hashcode hashcode与equals方法 集合元素如何判断是否相等 集合如何查看是否包含某个元素的更多相关文章

  1. 为什么要重写hashCode()方法和equals()方法及如何重写

    我想写的问题有三个: 1.首先我们为什么需要重写hashCode()方法和equals()方法 2.在什么情况下需要重写hashCode()方法和equals()方法 3.如何重写这两个方法 **** ...

  2. 为什么要重写hashcode方法和equals方法

    我们可能经常听到说重写equals方法必须重写hashcode方法,这是为什么呢?java中所有的类都是Object的子类,直接上object源码 /* * Copyright (c) 1994, 2 ...

  3. java 集合 HashSet 实现随机双色球 HashSet addAll() 实现去重后合并 HashSet对象去重 复写 HashCode()方法和equals方法 ArrayList去重

    package com.swift.lianxi; import java.util.HashSet; import java.util.Random; /*训练知识点:HashSet 训练描述 双色 ...

  4. hashCode()方法和equals方法的重要性。

    在Object中有两个重要的方法:hashCode()和equals(Object obj)方法,并且当你按ctrl+alt+s时会有Generator hashCode()和equals().我们不 ...

  5. Java的equals方法,首先要判断类型是否相同

    如下代码,Long 和Integer 进行比较: Integer aa = 1; Long bb= 1L; System.out.println(aa.equals(bb)); 输出为:false 查 ...

  6. Java 重写hashCode 方法和equals方法

    package Container; import java.util.HashSet; import java.util.Iterator; /* Set 元素是无序的(存入和取出的顺序不一定一致) ...

  7. hashCode方法和equals方法比较

    为什么用HashCode比较比用equals方法比较要快呢?我们要想比较hashCode与equals的性能,得先了解HashCode是什么. HashCode HashCode是jdk根据对象的地址 ...

  8. 如何重写Java中的equals方法

    Java中,只有8种基本类型不是对象,例如:4种整形类型(byte, short, int,long),2种浮点类型(flout, double),boolean, char不是对象,其他的所有类型, ...

  9. 重写Object类里equals方法

    package com.fff; public class Pet { private String name; private int age; public Pet(String nume,int ...

随机推荐

  1. 【翻译】Flume 1.8.0 User Guide(用户指南) Processors

    翻译自官网flume1.8用户指南,原文地址:Flume 1.8.0 User Guide 篇幅限制,分为以下5篇: [翻译]Flume 1.8.0 User Guide(用户指南) [翻译]Flum ...

  2. SEO常用命令大全

    SEO常用单个命令如下: link: 指某个特定网站的外部链接,这是一个主要获取排名和权重的主要因素. site: 呵呵,这个是经常用到的了,它是指某个特定网站收录情况. 用法:site: www.  ...

  3. temp-重庆银行

    重庆现场部署环境(开发环境)说明 : 数据库 172.16.69.95:1521:orcl      ilink/ilink123        sys/manager(dba权限) 1, Linux ...

  4. apache kylin的单节点及多节点安装

    Kylin的使用安装文档Kylin简介Kylin是什么Apache Kylin是一个开源的分布式分析引擎,最初由eBay开发贡献至开源社区.它提供Hadoop之上的SQL查询接口及多维分析(OLAP) ...

  5. jquery,html5,css3主要特性总结

    jquery特性: 1.丰富简单的DOM选择器 2.同一函数实现get和set 3.支持链式方法书写 4.完善的事件处理功能 5.强大的css动画效果 6.完善的Ajax 7.简单的元素样式操作 8. ...

  6. C++11常用特性的使用经验总结

    转自:http://www.cnblogs.com/feng-sc C++11已经出来很久了,网上也早有很多优秀的C++11新特性的总结文章,在编写本博客之前,博主在工作和学习中学到的关于C++11方 ...

  7. FPGA开发随笔汇总

    点击标题即可进入相关随笔. DE-SOC开发板VrilogHDL开发相关部分: (本过程需要Verilog HDL 的基本语言基础) 1.FPGA的发展史及FPGA 的基础架构 2.首先看一下友晶DE ...

  8. 转 Refresh Excel Pivot Tables Automatically Using SSIS Script Task

    Refresh Excel Pivot Tables Automatically Using SSIS Script Task https://www.mssqltips.com/sqlservert ...

  9. Shader_ShaderForge_NGUI_序列帧/

    序列帧 Shader篇 Shader Forge序列帧算法! 附上Shader代码部分: // Shader created with Shader Forge v1.26 // Shader For ...

  10. Flask框架(一)

    from flask import Flask app = Flask(__name__) @app.route('/') def index(): return '<h1>hello w ...