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中,这是不允许的。

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

  1. Java双等号,Equals(),HashCode()小结

    默认情况 - 双等号==,比较的是内存地址. - equals(),默认比较的是内存地址. - hashCode(),默认返回的是object的内存地址. String中方法改写的情况 经常会遇到需要 ...

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

    java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继 ...

  3. Java实战equals()与hashCode()

    一.equals()方法详解 equals()方法在object类中定义如下: 代码 public boolean equals(Object obj) { return (this == obj); ...

  4. equals()和hashcode()详解

    转载自http://www.cnblogs.com/Qian123/p/5703507.html java.lang.Object类中有两个非常重要的方法:   public boolean equa ...

  5. equals()与hashCode()方法详解

    java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继 ...

  6. 【Java】equals()与hashCode()方法详解 (转)

    java.lang.Object类中有两个非常重要的方法: 1 2 public boolean equals(Object obj) public int hashCode() Object类是类继 ...

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

    一.首先明确一点:equals()方法和hashcode()方法是Object类里的方法. 查看源码可以知道,在Object类中equals(obj)方法直接返回的是  this == obj 的值. ...

  8. Java 中的 equals() 和 hashCode()

    equals() 和 hashCode() 在 Object 类中以本地方法的形式存在,Java 中所有的类都继承了 Object 类,因此所有的类中都包含了这两个方法.这两个方法在 Java 开发中 ...

  9. 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 ...

随机推荐

  1. XCode9和10编译Cordova报错toLowerCase of undefined解决方案

    XCode升级到9或10后,cordova build时报错:toLowerCase of undefined... 解决方案: 修改platforms/ios/cordova/lib/list-em ...

  2. rod cutting

    for a rod of length i the price of it si pi,to cut the rod to earn more money package dynamic_progra ...

  3. cin与cout格式化输出

    cin 中“<<”流 输入运算符 ----------------------------------------------------------------------------- ...

  4. SpringBoot(三)thymeleaf+JPA+MySql

    接着上一节的 第一步:在pom文件中加入以下代码: <!--JPA--> <dependency> <groupId>org.springframework.boo ...

  5. 8--Python入门--函数

    函数基本框架如下([]中的内容表示是或选的,可以不写):def 函数名(参数): ['''函数说明文档'''] 函数主体 [return 返回对象] 函数小例子 #我们先定义一个函数 def find ...

  6. HTML <form> action 属性

    当提交表单时,发送表单数据到名为 "demo_form.html" 的文件(处理输入): <form action="demo_form.html" me ...

  7. js空数组

    首先我们定义一个空的数组: var a = [ ]; 数组a里面是空的没有值,接下来我们打印: console.log(!!a); 因为数组是空的,此处应该为false. 恰好相反,!!a为true. ...

  8. python 不同进程间通信

    from multiprocessing import Process,Queue import os def f (qq): qq.put([42,None,'hello']) #将列表传入队列qq ...

  9. exe4j使用说明

    1:首先下载exe4j,软件根据电脑的版本下载(32bit or 64bit,本人的电脑是64bit),我下载的是没显示电脑版本的exe4j,有本地导入的选项和联网下载的选项,安装jre后才能进入-图 ...

  10. js中常见事件

    1.onblur:(使用在表单元素中,当元素失去焦点的时候执行) 2.onchange:(使用在表单元素中,当某些东西改变是执行) 3.onclick:(鼠标点击一个元素时执行) 4.ondblcli ...