Java中==与equals的区别

前言:以前在培训班时听老师说 == 比较的是地址,equals比较的是内容,一直深信不疑,在日常工作使用中也没有出现问题,但现在翻看源码,发现在不重写equals方法时,比较的不是内容。
//如以下代码

 //构造方法
  public TestInterface3(String name,Integer agx){
    this.name = name;
    this.agx =agx;
  }
  /*
   * 姓名
   */
  private String name;
  /*
   * 年龄
   */
  private Integer agx;
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public Integer getAgx() {
    return agx;
  }
  public void setAgx(Integer agx) {
    this.agx = agx;
  }
  public static void main(String [] args ){
    TestInterface3 test = new TestInterface3("test",1);
    TestInterface3 test1 = new TestInterface3("test",1);
    System.out.println(test1.equals(test));
    System.out.println(test1==test);
  }
  //结果
 equals方法---false
==方法---false

以上代码我没有重写equals方法,用的是Object中的equlas方法,==结果是对的,因为它们两个的地址不相同,故返回false
如果equals比较的是内容的话,那么为什么我两个对象中的内容相同,结果却返回的是false,翻看Object源码中的equals发现,equals其实是比较的是地址,源码如下:

//Object源码中的equals方法
public boolean equals(Object obj) {
        return (this == obj);
    }

故不重写equlas比较的是地址,那么我们重写一下equals方法看结果是什么,代码如下

public TestInterface3(String name,Integer agx){
    this.name = name;
    this.agx =agx;
  }
  /*
   * 姓名
   */
  private String name;
  /*
   * 年龄
   */
  private Integer agx;
  public String getName() {
    return name;
  }
  public void setName(String name) {
    this.name = name;
  }
  public Integer getAgx() {
    return agx;
  }
  public void setAgx(Integer agx) {
    this.agx = agx;
  }
  
  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((agx == null) ? 0 : agx.hashCode());
    result = prime * result + ((name == null) ? 0 : name.hashCode());
    return result;
  }
  //重写的equals方法
  @Override
  public boolean equals(Object obj) {
    if (this == obj)
      return true;
    if (obj == null)
      return false;
    if (getClass() != obj.getClass())
      return false;
    TestInterface3 other = (TestInterface3) obj;
    if (agx == null) {
      if (other.agx != null)
        return false;
    } else if (!agx.equals(other.agx))
      return false;
    if (name == null) {
      if (other.name != null)
        return false;
    } else if (!name.equals(other.name))
      return false;
    return true;
  }
  public static void main(String [] args ){
    TestInterface3 test = new TestInterface3("test",1);
    TestInterface3 test1 = new TestInterface3("test",1);
    System.out.println(test1.equals(test));
    System.out.println(test1==test);
  }
  //结果
 equals方法---true
==方法---false

这就能证明其实在不重写equals方法的情况下,比较的是地址,默认重写情况下比较的是内容

这时候有朋友说了为什么String类型在用equals时不用重写呢?那是因为String类已经帮咱们重写了equals与hashCode方法了

以上如有错误欢迎指正

上一篇:RAFT-Stereo: Multilevel Recurrent Field Transforms for Stereo Matching RAFT-Stereo:用于立体匹配的多级递归场变换


下一篇:GRU、LSTM、双向循环神经网络