Java---hashCode()和equals()
1.hashCode()和equals() API
hashCode()和equals()都来自上帝类Object, 所有的类都会拥有这两个方法,特定时,复写它们。
它们是用来在同一类中做比较用的,尤其是在容器里如Set存放同一类对象时用来判断放入的对象是否重复。
下面是API中的介绍:
|
boolean equals (Object obj) :比较两个对象是否相等。 equals方法在非空对象引用上实现等价关系: 自反性 :对于任何非空的参考值x , x.equals(x)应该返回true 。 对于任何非空引用值 x,x.equals(null) 都应返回 false。 Object 类的 equals 方法实现对象上差别可能性最大的相等关系;即,对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true(x == y 具有值 true)。 注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码。 |
|
int hashCode () :返回对象的哈希码值。 支持此方法是为了提高哈希表(例如 java.util.Hashtable 提供的哈希表)的性能。 hashCode 的常规协定是: 在 Java 应用程序执行期间,在对同一对象多次调用 hashCode 方法时,必须一致地返回相同的整数,前提是将对象进行 equals 比较时所用的信息没有被修改。 从某一应用程序的一次执行到同一应用程序的另一次执行,该整数无需保持一致。 实际上,由 Object 类定义的 hashCode 方法确实会针对不同的对象返回不同的整数。(这一般是通过将该对象的内部地址转换成一个整数来实现的,但是 JavaTM 编程语言不需要这种实现技巧。) |
要点:
(1)equals()相等的两个对象,hashcode()一定相等,equals()不相等的两个对象,却并不能证明它们的hashcode()不相等;
equals()方法不相等的两个对象,hashCode()有可能相等。
(2)hashcode()不等,一定能推出equals()也不等;hashcode()相等,equals()可能相等,也可能不等。
(3)在object类中,hashcode()方法是本地方法,返回的是本对象(单一对象)的地址值;而object类中的equals()方法比较的
也是两个对象的地址值。如果equals()相等,说明两个对象地址值也相等,hashcode()也就相等。
(4)当我们重写一个对象的equals方法,通常有必要重写它的hashCode方法。以维护 hashCode 方法的常规协定
equals()与==的比较
(1)'=='是用来比较两个变量(基本类型和对象类型)的值是否相等的。 如果两个变量是基本类型的,直接比较值就可以了。如果两个变量是对象类型的,比较的是这两个对象在栈中的引用(即地址)。
对象是放在堆中的,栈中存放的是对象的引用(地址)。由此可见'=='是比较栈中的值。如果要比较堆中对象的内容是否相同,那么就要重写equals方法了。
(2)Object类中的equals方法就是用'=='来比较的,所以如果没有重写equals方法,equals和==是等价的。
通常我们会重写equals方法,让equals比较两个对象的属性内容,而不是比较对象的引用(地址),因为往往我们觉得比较对象的内容是否相同比比较对象的引用(地址)更有意义。
2.HashCode的作用
在数据结构---哈希表中简单介绍了散列表的原理,一句话就是:hash算法提高了查找元素的效率。
如何查找一个集合中是否包含有某个对象呢?
一种方法是逐一取出每个元素与要查找的对象,使用equals方法比较的是否相等。如果一个集合中有很多个元素,则效率很慢。
|
哈希算法的思想:HashCode应该就和使用拼音查询汉字相似(建立拼音索引),这种方式将集合分成若干个存储区域,每个对象可以计算出一个哈希码,可以将HashCode分组,每组分别对应某个存储区域,根据一个对象的HashCode就可以确定该对象应该存储在哪个区域。 Object类中定义了一个hashCode()方法来返回每个Java对象的HashCode,当从Set集合中查找某个对象时,Java系统首先调用对象的hashCode()方法获得该对象的hashCode表,然后根据hashCode找到相应的存储区域,最后取得该存储区域内的每个元素与该对象进行equals方法比较。这样就不用遍历所有对象,提高效率。 |
![]() |
HashCode在Java容器中的应用
对于List集合、数组而言,HashCode不重要,但是对于HashMap、HashSet、HashTable等而言,它变得异常重要。所以在使用HashMap、HashSet、HashTable时一定要注意hashCode。对于一个对象而言,其hashCode过程就是一个简单的Hash算法的实现,其实现过程对你实现对象的存取过程起到非常重要的作用。
一个对象肯定存在若干个属性,如何选择属性实现均匀散列(哈希表也称为散列表,其要保持尽可能均匀,不重复),考验着一个人的设计能力。
如果我们将所有属性进行散列,这必定会是一个糟糕的设计,因为对象的hashCode方法无时无刻不是在被调用,如果太多的属性参与散列,那么需要的操作数时间将会大大增加,这将严重影响程序的性能。
如果较少属相参与散列,散列的多样性会削弱,会产生大量的散列“冲突或碰撞”,除了不能够很好的利用空间外,在某种程度也会影响对象的查询效率。其实这两者是一个矛盾体,散列的多样性会带来性能的降低。
3.复写(@Override)hashCode()和equals() 的栗子
public class Employee implements Comparable<Employee> {
private String name;
private int age;
public Employee() {
super();
}
public Employee(String name, int age) {
super();
this.name = name;
this.age = age;
}
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;
}
@Override
public String toString() {
return "Emplooye [name=" + name + ", age=" + 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;
Employee other = (Employee) 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;
}
@Override
public int compareTo(Employee o) {
int temp = this.age - o.age;
return temp==0? this.name.compareTo(o.name):temp;
}
}

2018-01-07
Java---hashCode()和equals()的更多相关文章
- Java hashCode() 和 equals()的若干问题
原文:http://www.cnblogs.com/skywang12345/p/3324958.html 本章的内容主要解决下面几个问题: 1 equals() 的作用是什么? 2 equals() ...
- Java hashCode() 和 equals()的若干问题解答
本章的内容主要解决下面几个问题: 1 equals() 的作用是什么? 2 equals() 与 == 的区别是什么? 3 hashCode() 的作用是什么? 4 hashCode() 和 equa ...
- Java hashCode 和 equals()
1 Object中定义的hashCode() public int hashCode() Returns a hash code value for the object. This method i ...
- Java hashCode() 和 equals()的若干问题解答<转载自skywang12345>
第1部分 equals() 的作用equals()的作用是用来判断两个对象是否相等.equals()定义在JDK的Object类中.通过判断两个对象的地址是否相等(即,是否是同一个对象)来区分它们是否 ...
- JAVA - hashcode与equals作用、关系
Hashcode的作用 总的来说,Java中的集合(Collection)有两类,一类是List,再有一类是Set.前者集合内的元素是有序的,元素可以重复:后者元素无序,但元素不可重复. ...
- 高强度学习训练第十二天总结:Java hashCode和equals的关系
今天要收拾东西.草草的总结下.. 1.如果两个对象相等,则hashcode一定也是相同的 2.两个对象相等,对两个对象分别调用equals方法都返回true 3.两个对象有相同的hashcode值,它 ...
- Java hashCode与equals学习
1.关于Object类的equals方法的特点 a) 自反性: x.equals(x) 应该返回true b) 对称性: x.equals(y)为true,那么y.equals(x) 也为true c ...
- java hashCode()与equals()的作用
1.hashcode是用来查找的,如果你学过数据结构就应该知道,在查找和排序这一章有 例如内存中有这样的位置 0 1 2 3 4 5 6 7 而我有个类,这个类有个字段叫ID,我要把这个 ...
- Java提高篇——equals()与hashCode()方法详解
java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继 ...
- Java基础系列-equals方法和hashCode方法
原创文章,转载请标注出处:<Java基础系列-equals方法和hashCode方法> 概述 equals方法和hashCode方法都是有Object类定义的. publi ...
随机推荐
- 前端chrome浏览器调试
引言 "工欲善其事,必先利其器" 恩,这句话我觉得说的特别有道理,举个例子来说吧,厉害的化妆师都有一套非常专业的刷子,散粉刷负责定妆,眼影刷负责打眼影,各司其职,有了专业的工具才能 ...
- VS2015 密钥key
亲测可用: HMGNV-WCYXV-X7G9W-YCX63-B98R2
- 《跟我学IDEA》二、配置maven、git、tomcat
上一篇博文我们讲解了如何去下载并安装一个idea,在这里我们推荐的是zip的解压版,另外我们配置的一些编码和默认的jdk等.今天我们来学习配置maven.git.tomcat等.还是那句话,工欲善其事 ...
- loadrunner 参数存储在data.ws、paralist、globals.h 中区别(参数与变量额区别于使用)
1.如果变量数据只有一个值,可以直接放在data.ws 中 2.如果变量要根据循环取随机值.序列值等(参数存在一组值),放在paralist中 3.如果是申明全局变量,且要在代码中用到参 ...
- loadrunner录制脚本(一) ----录制脚本打不开浏览器
loadrunner安装参考百度上的,或者有已经准备好的安装文档. 安装好了之后,用 HP Virtual Generator 录制脚本. 在上述操作中,需要选择火狐浏览器的exe文件驱动.也可以选择 ...
- Android研究之监听自身应用被卸载代码实现
1.通过jni实现函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 3 ...
- [Android] AutoCompleteTextView:自己主动完毕输入内容的控件(自己主动补全)
AutoCompleteTextView是EditText的直接子类,与普通EditText的最大不同就是.在用户输入的过程中,能够列出可供选择的输入项.方便使用者. AutoCompleteText ...
- 零基础学python-2.8 字典
字典类型,事实上就是相当于java的map,通过key-value来记录数据,工作原理类似于哈希表 差点儿全部的python对象都能够作为key,可是一般最经常使用的还是数字和字符串 字典元素使用{} ...
- 使用Mybatis-Generator自己主动生成Dao、Model、Mapping相关文件
准备工作: 1.数据库驱动程序 2.generatorConfig驱动,(下载地址:https://github.com/mybatis/generator/releases) 3.generator ...
- hdu2601 An easy problem(数学)
题目意思: http://acm.hdu.edu.cn/showproblem.php? pid=2601 给出一个数N,求N=i*j+i+j一共同拥有多少种方案. 题目分析: 此题直接暴力模拟就可以 ...
