Java中equals()知识点总结

经过几天的学习,终于对equals的用法有了比较全面的认识,并做一个总结。

1.equals的本意——即在Object对象中定义的equals()方法有什么样的意义。

(此处先附上==的作用,后面仍有叙述。因为==和equals()方法的关系是很密切的,后面有我自己的看法。

==用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true
而在比较引用时,如果引用指向内存中的同一对象,结果为true)

public boolean equals(Object obj)

其比较规则为:当参数obj引用的对象与当前对象为同一个对象时,就返回true,否则返回false.

public class Fish {
 private int weight;
 private String color;

 public Fish(int weight, String color) {
  this.color = color;
  this.weight = weight;
 }

 public int getWeight() {
  return weight;
 }

 public void setWeight(int weight) {
  this.weight = weight;
 }

 public String getColor() {
  return color;
 }

 public void setColor(String color) {
  this.color = color;
 }

}

public class EqualsTest {
 public static void main(String[] args) {
  Fish f1 = new Fish(1, "blue");
  Fish f2 = new Fish(1, "blue");

  System.out.println(f1 == f2);
  System.out.println(f1.equals(f2));
 }
}

运行结果为

false
false

由此可见,equals()方法的本意为确定两个对象的引用是否相同。

2.而JDK类中有一些类覆盖了oject类的equals()方法,比较规则为:如果两个对象的类型一致,并且内容一致,则返回true,这些类有:

java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double等)

public class EqualsTest {
 public static void main(String[] args) {
  String s1=new String("sss");
  String s2=new String("sss");

  System.out.println(s1==s2);
  System.out.println(s1.equals(s2));
 }
}

运行结果为

false
false

由此可见,equals()方法的本意为确定两个对象的引用是否相同。

2.而JDK类中有一些类覆盖了oject类的equals()方法,比较规则为:如果两个对象的类型一致,并且内容一致,则返回true,这些类有:

java.io.file,java.util.Date,java.lang.string,包装类(Integer,Double等)

public class EqualsTest {
  public static void main(String[] args) {
    String s1=new String("sss");
    String s2=new String("sss");

    System.out.println(s1==s2);
    System.out.println(s1.equals(s2));
  }
}

运行结果为

false
true

由此知道,在String中equals()方法被进行了覆盖,使其意义变为比较两个对象的内容是否一致

3.如果我们要自己覆盖equals()方法,让其比较内容或者有别的使用方法(当然我们一般都是用于比较内容的,但是覆盖的方法中真正的实现究竟是什么样的,谁知道呢O(∩_∩)O~)

public class Fish {
  private int weight;
  private String color;

  public Fish(int weight, String color) {
    this.color = color;
    this.weight = weight;
  }

  @Override
  public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((color == null) ? 0 : color.hashCode());
    result = prime * result + weight;
    return result;
  }

  @Override
  public boolean equals(Object obj) {
    if (this == obj)
      return true;
    if (obj == null)
      return false;
    if (getClass() != obj.getClass())
      return false;
    Fish other = (Fish) obj;
    if (color == null) {
      if (other.color != null)
        return false;
    } else if (!color.equals(other.color))
      return false;
    if (weight != other.weight)
      return false;
    return true;
  }
  public int getWeight() {
    return weight;
  }

  public void setWeight(int weight) {
    this.weight = weight;
  }

  public String getColor() {
    return color;
  }

  public void setColor(String color) {
    this.color = color;
  }

}

public class EqualsTest {
  public static void main(String[] args) {
    Fish f1 = new Fish(1, "blue");
    Fish f2 = new Fish(1, "blue");

    System.out.println(f1 == f2);
    System.out.println(f1.equals(f2));
  }
}

运行结果为

false
true

此例子中我复写了equals()方法和hashcode()方法,使得equals()方法脱离的本意,不再是比较两个对象的引用是否相同,而是比较其内容是否相同。

以上内容为一般书上的总结,下面是我自己想到的一些东西。

我们可以知道计算机归根到底进行的只是一些二进制数的与或非运算,加法乘法运算。由此有了些基本的运算符,所有的函数本质上其实现都是使用基本运算符来实现的。而==是基本运算符中的一个,它的作用:用于比较引用和比较基本数据类型时具有不同的功能:
比较基本数据类型,如果两个值相同,则结果为true
而在比较引用时,如果引用指向内存中的同一对象,结果为true

而equals()作为方法,我们可以推测知道,它其中的实现所使用的肯定是==运算符。再进一步的思考,equals()本意不正是==运算符进行对象比较时候的作用吗。那么,既然是两者有同样的作用,为什么还要弄出一个equals()方法来呢。因为==运算符不允许我们进行覆盖,也就是说它限制了我们的表达。在上面的第三个例子中,我们复写equals()方法,达到比较对象内容是否相同的目的。而这些通过==运算符是做不到的。

到此这篇关于Java中equals()知识点总结的文章就介绍到这了,更多相关Java中的equals()内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Java自定义实现equals()方法过程解析

    这篇文章主要介绍了Java自定义实现equals()方法过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 以常见的自定义Date类型为例,没有经验的朋友可能会觉得直接比较年月日即可,从而写出以下的实现 public class MyDate implements Comparable<MyDate> { private final int year; private final int month; private final int

  • Java中比较运算符compareTo()、equals()与==的区别及应用总结

    前言 比较运算符用于判断两个数据的大小,例如:大于.等于.不等于.比较的结果是一个布尔值( true 或 false ). Java 中常用的比较运算符如下表所示: 本文主要给大家介绍了关于Java比较运算符compareTo().equals()与==区别及应用的相关内容,下面话不多说了,来一起看看详细的介绍吧 1.== 和 equals的区别: ==主要是两个变量值的比较,返回值为true 或者是false.对于普通变量,如:int a=10; int  b= 10; a==b,返回为 tr

  • Java中equals()方法重写实现代码

    Java中equals()方法重写实现代码 Java中的equals()方法是在Object类中定义,Object类是所有类的父类.换句话说,任何类都隐含地继承了该方法.判断两个对象的内容是否相同,必须使用equals()方法,对于没有重写该方法的类,需要重写该方法. 重写equals()方法代码如下: /** *equlas()方法重写实例 */ class User { /** *方法描述:设置name值 *输入参数:String name *返回类型:void */ public void

  • Java中==符号与equals()的使用详解(测试两个变量是否相等)

    Java 程序中测试两个变量是否相等有两种方式:一种是利用 == 运算符,另一种是利用equals()方法. 当使用 == 来判断两个变量是否相等时,如果两个变量是基本类型变量,且都是数值类型(不一定要求数据类型严格相同),则只要两个变量的值相等,就返回true. 但是对于两个引用类型变量,只有它们指向同一个对象时, == 判断才会返回true. == 不可用于比较类型上没有父子关系的两个对象. 很多书上说equals()方法是判断两个对象的值相等.这种说法不准确.实际上equals()方法是O

  • java中重写equals()方法的同时要重写hashcode()方法(详解)

    object对象中的 public boolean equals(Object obj),对于任何非空引用值 x 和 y,当且仅当 x 和 y 引用同一个对象时,此方法才返回 true: 注意:当此方法被重写时,通常有必要重写 hashCode 方法,以维护 hashCode 方法的常规协定,该协定声明相等对象必须具有相等的哈希码.如下: (1) 当obj1.equals(obj2)为true时,obj1.hashCode() == obj2.hashCode()必须为true (2) 当obj

  • 详解java==运算符和equals()方法的区别

    Java语言程序中判断两个变量是否相等有两种方式:一是运用==运算符,二是运用equals方法. 1. ==运算符 对于==运算符来说,如果两个变量是基本类型的,并且是数值类型,则只要它们的值相等,就会返回true:然而如果是两个引用类型的变量,则分为两种情况:1)它们指向同一个对象,结果返回true:2)它们指向不同的对象,即使对象内容相同,结果还是返回false:下面程序示范了使用==运算符比较两个变量是否相等的结果: public class Test { public static vo

  • Java中equals()知识点总结

    经过几天的学习,终于对equals的用法有了比较全面的认识,并做一个总结. 1.equals的本意--即在Object对象中定义的equals()方法有什么样的意义. (此处先附上==的作用,后面仍有叙述.因为==和equals()方法的关系是很密切的,后面有我自己的看法. ==用于比较引用和比较基本数据类型时具有不同的功能: 比较基本数据类型,如果两个值相同,则结果为true 而在比较引用时,如果引用指向内存中的同一对象,结果为true) public boolean equals(Objec

  • 详解 Java 中 equals 和 == 的区别

    详解 Java 中 equals 和 == 的区别 1 前言 在 Java 语言中,equals 和 == 都是用来检测两个字符串是否相等,返回值也都是布尔型(boolean),但是两者在内部比较的处理中却不尽相同,因此在需要检测两个字符串是否相等的时候,我们一定要特别的注意,选择适当的检测方式,防止造成不必要的 bug.从表面上来看,这种 bug 很像随机产生的间歇性错误. 2 区别 在需要检测两个字符串是否相等的时候,我们可以使用 equals 方法.对于表达式: s.equals(t) 如

  • 浅谈java 中equals和==的区别

    本文实例为大家分享了java 中equals和==的区别的具体代码,供大家参考,具体内容如下 java9举例代码: String str1 = "abc"; String str2 = "abc"; String str3 = new String("abc"); String str4 = new String("abc"); 当: str1 == str2    输出:true 当:str1.equals(str2); 输

  • 简单介绍java中equals以及==的用法

    简单介绍 equals方法是java.lang.Object类的方法有两种用法说明: 一.对于字符串变量来说,使用"=="和"equals()"方法比较字符串时,其比较方法不同. 1."=="比较两个变量本身的值,即两个对象在内存中的首地址.(java中,对象的首地址是它在内存中存放的起始地址,它后面的地址是用来存放它所包含的各个属性的地址,所以内存中会用多个内存块来存放对象的各个参数,而通过这个首地址就可以找到该对象,进而可以找到该对象的各个属

  • java中Supplier知识点总结

    1.说明 这个接口是提供者的意思,只有一个抽象的get,没有默认的方法和静态的方法,导入一个泛T,get方法,返回一个泛T. supplier也用于创建对象,但与传统的创建对象语法不同:new, Supplier不同于Function,它不接受参数,直接为我们生产指定的结果,有点像生产者模式. 2.实例 class Person { String firstName; String lastName; Person() {} Person(String firstName, String las

  • Java中equals()方法实例详解

    目录 equals()在哪里 Java中重写的equals() 在Java中比较的推荐方法 为什么要在我们自己的类中重写equals() 重写equals()的规范 重写equals()可能的误区 一般的equals()写法 附:java中equals()方法的正确使用 总结 equals()在哪里 首先我们知道Java中Object类是所有类的父类,它里面定义了equals()方法: public boolean equals(Object obj) { return (this == obj

  • Java中 equals 重写时为什么一定也要重写 hashCode

    目录 1.equals 方法 2.hashCode 方法 2.1 hashCode 使用 3.为什么要一起重写? 3.1 Set 正常使用 3.2 Set 集合的“异常” 3.3 解决“异常” 3.4 原因分析 总结 前言: equals 方法和 hashCode 方法是 Object 类中的两个基础方法,它们共同协作来判断两个对象是否相等.为什么要这样设计嘞?原因就出在“性能” 2 字上. 使用过 HashMap 我们就知道,通过 hash 计算之后,我们就可以直接定位出某个值存储的位置了,那

  • java中equals和等号(==)的区别浅谈

    java中的数据类型,可分为两类:1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean   他们之间的比较,应用双等号(==),比较的是他们的值. 2.复合数据类型(类)   当他们用(==)进行比较的时候,比较的是他们在内存中的存放地址,所以,除非是同一个new出来的对象,他们的比较后的结果为true,否则比较后结果为false.JAVA当中所有的类都是继承于Object这个基类的,在Object中的基类中定义了一个eq

  • Java中Equals使用方法汇总

    这篇总结的形式是提出个问题,然后给出问题的答案.这是目前学习知识的一种尝试,可以让学习更有目的. Q1.什么时候应当重写对象的equals方法? 答:一般在我们需要进行值比较的时候,是需要重写对象的equals方法的.而例外情况在<effective java>的第7条"在改写equals的时候请遵守通用约定"中清楚描述了. 我们知道,在Java中,每个对象都继承于Object.如果不重写,则默认的equals代码如下所示: public boolean euqals(Ob

随机推荐