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. 触发移动App崩溃的测试场景

    验证在有不同的屏幕分辨率,操作系统和运营商的多个设备上的App行为. 用新发布的操作系统版本验证App的行为. 验证在如隧道,电梯等网络质量突然改变的环境中的App行为. 通过手动网络从蜂窝更改到Wi ...

  2. openssl查看apk的证书信息

    查看apk的证书信息: openssl pkcs7 -inform DER -in CERT.RSA -noout -print_certs -text

  3. Javascript 2.4

    ---恢复内容开始--- 弱类型语言,可以随意修改变量的数据类型 "..."中的字符串包含 " 时需要转义字符  \" '...'中的而字符串包含 ' 时需要转 ...

  4. #考研笔记#计算机之PPT问题

    PPT1. 幻灯片母版.版式.模板之间的联系与区别?见下 12 2. 占位符的意义用于幻灯片上,就表现为一个虚框,虚框内部往往有“单击此处添加标题”之类的提示语,一旦鼠标点击之后,提示语会自动消失.当 ...

  5. java中的可释放资源定义,类似c#中的using

    public static class FileDuplicator implements AutoCloseable { Scanner in = null; PrintWriter out = n ...

  6. 三、tcp、ip协议详细

    1. 什么是 TCP/IP? TCP/IP 是一类协议系统,它是用于网络通信的一套协议集合. 传统上来说 TCP/IP 被认为是一个四层协议 1) 网络接口层: 主要是指物理层次的一些接口,比如电缆等 ...

  7. vue watch 可以监听子组件props里面属性的改变

    子组件watch 可以监听其props里面属性的改变 当changeFather导致calm改变时,会执行console.log('props change');

  8. Javascript var 和 let 的区别

    Javascript var 和 let 的区别 var 是函数块的全局变量. let 是代码块的局部变量. let 变量不会提升,如果先使用后定义会 undefind. 参考: https://de ...

  9. tcp_timestamps和tcp_tw_recycle

    不同时开启tcp_timestamps和tcp_tw_recycle的场景描述 FULL NAT下 FULL NAT  在client请求VIP 时,不仅替换了package 的dst ip,还替换了 ...

  10. Java面向对象 第5节 抽象类和接口

    一.抽象类和抽象方法 区分抽象方法和普通方法1)当一个方法被abstract修饰时,该方法成为抽象方法2)抽象类所在的类必须定义为抽象类3)抽象方法不会有具体的实现,而是在抽象类的子类中通过方法重写进 ...