==、equals和hashCode小结

1、==

==是关系操作符,对于基本类型(byte,short,char,int,long,float,double,boolean),比较的是值是否相等;对于对象,比较的是对象的引用(也即栈内存中的存放地址)是否相等。

2、equals

equals是Object类中的方法,默认比较引用,和==处理对象的结果一样,不适用于基本类型。Object中的equals方法如下:

public boolean equals(Object obj){
    return (this==obj);
}

如果要用equals来比较对象的内容是否相等,需要覆盖equals方法;其实大多数java类库(String、Integer和Date等)都覆盖实现了自己的equals方法。

正确的equals需满足以下5点:

  • 自反性。对任意x,x.equals(x)必须返回true;
  • 对称性。对于任意x和y,如果y.equals(x)返回true,x.equals(y)必须返回true;
  • 传递性。对于任意x、y和z,如果x.equals(y)返回true,并且y.equals(z)也返回true,那么x.equals(z)也必须返回true;
  • 一致性。对于任意x和y,如果对象中用于比较的信息没有改变,多次调用该x.equals(y),返回结果要么一直是true,要么一直是false;
  • 对于任何非null的x,x.equals(null)一定返回false。

3、hashCode

hashCode返回对象的散列码,返回值是int类型,对象的散列码是为了更好的支持基于哈希机制的Java集合类,例如 Hashtable, HashMap, HashSet 等。Object中的hashCode方法如下:

public native int hashCode();

关于hashCode方法需要注意以下几点:

  • 重写了equals方法的对象必须同时重写hashCode()方法;
  • equals相等的两个对象,hashCode也要相等;
  • equals不等的两个对象,hashCode允许相同。

为什么equals相等的两个对象,其hashCode返回的值一定相等?

对于集合类HashSet、HashMap等和hash有关的类(以HashSet为例),是通过hash算法来散列对象的。对HashSet而言,存入对象的流程为:根据对象的hash码,经过hash算法,找到对象应该存放的位置,如果该位置为空,则将对象存入该位置;如果该位置不为空,则使用equals()比较该位置的对象和将要入的对象,如果两个相等,则不再插入,如果不相等,根据hash冲突解决算法将对象插入其他位置。

而java规定对于HashSet判断是不是重复对象就是通过equals() 方法来完成,这就需要在两个对象equals()方法相等的时候,hash码一定相等(即hashCode()返回的值相等)。假设两个对象equals()方法相等的时候,hash码不相等,会出现equals()相等的两个对象都插入了HashSet中,这时不允许的。

时间: 2024-08-04 10:16:40

==、equals和hashCode小结的相关文章

Java实战equals()与hashCode()

一.equals()方法详解 equals()方法在object类中定义如下: 代码 public boolean equals(Object obj) { return (this == obj); } 很明显是对两个对象的地址值进行的比较(即比较引用是否相同).但是我们知道,String . Math.Integer.Double等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方 法. 比如在String类中如下: 代码 public boolean eq

equals()和hashcode()详解

转载自http://www.cnblogs.com/Qian123/p/5703507.html java.lang.Object类中有两个非常重要的方法: public boolean equals(Object obj) public int hashCode() Object类是类继承结构的基础,所以是每一个类的父类.所有的对象,包括数组,都实现了在Object类中定义的方法. equals()方法详解 equals()方法是用来判断其他的对象是否和该对象相等. equals()方法在ob

Java提高篇——equals()与hashCode()方法详解

java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继承结构的基础,所以是每一个类的父类.所有的对象,包括数组,都实现了在Object类中定义的方法. equals()方法详解 equals()方法是用来判断其他的对象是否和该对象相等. equals()方法在object类中定义如下: public boolean equals(Object obj)

关于equals、hashcode和集合类的小结

一.首先明确一点:equals()方法和hashcode()方法是Object类里的方法. 查看源码可以知道,在Object类中equals(obj)方法直接返回的是  this == obj 的值.对于引用变量来说,这个式子判断的是变量中存储的内存地址是否一致.而hashcode()方法的出现,目的是为了提高哈希表的性能,也就是说,提供这样一个方法是为了提高依据hashcode进行存取的数据结构的性能的. 两者的关系: 在Object类的注释中可以看到两个原则: 两个类如果通过equals()

Java 中的 ==, equals 与 hashCode 的区别与联系

一.概述 1.概念 == : 该操作符生成的是一个boolean结果,它计算的是操作数的值之间的关系 equals : Object 的 实例方法,比较两个对象的content是否相同 hashCode : Object 的 native方法 , 获取对象的哈希值,用于确定该对象在哈希表中的索引位置,它实际上是一个int型整数 二.关系操作符 == 1.操作数的值 基本数据类型变量 在Java中有八种基本数据类型: 浮点型:float(4 byte), double(8 byte) 整型:byt

看Java中==、equals、hashCode的来龙去脉

我有一个哥们去参加了面试,面试官这样问一个Java问题: 你说一下java对象的equals方法调用什么方法呢?我这个哥们想了想,回答说"应该是比较的引用".听了这个答案之后,那个面试官摇头晃脑的说:"不对,你回答的不对,equals方法调用的是hashCode方法".于是乎,我那个技术还不错的哥们就悲壮地栽在这道题目上了. 今天晚上,西安历史上少有的热,那就好好总结一下这个题目的来龙去脉好了,也方便给后面的朋友们提个醒,不要栽在这么简单的问题上.你说这个面试官回答

How to implement equals() and hashCode() methods in Java[reproduced]

Part I:equals() (javadoc) must define an equivalence relation (it must be reflexive, symmetric, and transitive). In addition, it must be consistent (if the objects are not modified, then it must keep returning the same value). Furthermore, o.equals(n

equals与hashCode的剖析

Java中有两条众所周知的规定 1)对象相等必须有相等的hashCode 2)两个对象不相等,hashCode可能相同 但是为什么有这两个规定呢,不可能凭空产生,总是有原因的,下面我们就来分析两条规定的由来 1. 哈希码 首先这两条规定和哈希码密不可分,甚至可以说这两条规定就是为了对象的hashCode()实现. hashCode()方法返回的就是该对象的哈希码,是一个整数,通过该哈希码我们可以确定该对象在散列存储结构中的地址(比如Set,HashMap的key),快速索引该对象,查找效率极高.

一次性搞清楚equals和hashCode

前言 在程序设计中,有很多的“公约”,遵守约定去实现你的代码,会让你避开很多坑,这些公约是前人总结出来的设计规范. Object类是Java中的万类之祖,其中,equals和hashCode是2个非常重要的方法. 这2个方法总是被人放在一起讨论.最近在看集合框架,为了打基础,就决定把一些细枝末节清理掉.一次性搞清楚! 下面开始剖析. public boolean equals(Object obj) Object类中默认的实现方式是  :   return this == obj  .那就是说,