• 技术文章 >Java >Java基础

    java equals()方法怎么用

    青灯夜游青灯夜游2023-01-06 14:42:33原创118

    在java中,equals()方法用于检测一个对象是否等于另一个对象,语法“Object.equals(Object2)”;该方法判断两个对象是否具有相同的引用,如果两个对象具有相同的引用,它们一定是相等的。equals()方法不能作用于基本数据类型的变量。

    本教程操作环境:windows7系统、java8版、DELL G3电脑。

    java equals()方法判断对象是否相等

    equals方法用于检测一个对象是否等于另一个对象。注意:equals方法不能作用于基本数据类型的变量

    在Object类中,这个方法判断两个对象是否具有相同的引用,如果两个对象具有相同的引用,它们一定是相等的。

    从这点上看,将其作为默认操作也是合乎情理的。然而,对于多数类来说,这种判断并没有什么意义,例如,采用这种方式比较两个PrintStream是否相等就完全没有意义。然而,经常需要检测两个对象状态的相等性,如果两个对象的状态相等,就认为这两个对象是相等的。所以一般在自定义类中都要重写equals比较。

    下面给出编写一个完美equals()方法的建议:

    (1)显式参数命名为otherObject,稍后需要将转换成一个叫other的变量

    (2)检测this与otherObject是否引用同一个对象:

    if(this==otherObject) return true;

    这条语句只是一个优化。实际上,这是一种经常采用的形式。因为计算这个等式要比一个一个地比较类中的域所付出的代价小的多。

    (3)检测otherObject是否为null,如果为null,返回false。这项检测是很必要的。

    if(otherObject==null) return false;

    (4)比较this和otherObject是否属于同一个类,如果equals的语义在每个子类中有所改变,就使用getClass()检测,它将自己作为目标类

    if(getClass()!=otherObject.getClass()) return false;

    如果所有的子类都拥有同一的语义,就使用instanceof检测

    if(!(otherObject instanceof ClassName)) return false;

    (5)将otherObject转换为相应类型的变量:

    ClassName other=(ClassName)otherObject;

    (6)现在开始对所有需要比较的域进行比较。使用==比较基本类型域,使用equals比较对象域。如果所有域都匹配,就返回true,否则返回false;

    return field1==other.field1&&field2.equals(other.field2)

    如果在子类中重新定义equals,就要在其中包含调用super.equals(other)。如果检测失败,就不可能相等。如果超类中的域相等,就比较子类中的实例域。

    对于数组类型的域,可以使用静态的Arrays.equals方法检测相应的元素是否相等。

    来看几个字符串比较例子:

    String a = "abc";
    String b = "abc";
    String c = new String("abc");
    String d = new String("abc");
    System.out.println(a == b); // true 因为JAVA中字符串常量是共享的,只有一个拷贝
    System.out.println(a == c); // false a和c属于2个不同的对象
    System.out.println(a.equals(c)); // true 由于String对象的equals方法比较的是对象中的值,所以返回true。(和Object的equals方法不同)
    System.out.println(c==d); // false c和d虽然对象内的值相同,但属于2个不同的对象,所以不相等
    System.out.println(c.equals(d)); // true

    1.png

    简单的说,当比较字符串常量时,等于和equals返回的结果一样,当想比较字符串对象的值时用equals。

    看一个equals的使用例子:

    package chapter05.EqualsTest;
      
    import java.util.*;
      
    public class EqualsTest {
     public static void main(String[] args) {
      Employee alice1 = new Employee("Alice Adams", 75000, 1987, 12, 15);
      Employee alice2 = alice1; // reference the same object
      Employee alice3 = new Employee("Alice Adams", 75000, 1987, 12, 15);
      Employee bob = new Employee("Bob Brandson", 50000, 1989, 10, 1);
      
      System.out.println("alice1 == alice2: " + (alice1 == alice2));
      
      System.out.println("alice1 == alice3: " + (alice1 == alice3));
      
      System.out.println("alice1.equals(alice3): " + (alice1.equals(alice3)));
      
      System.out.println("alice1.equals(bob): " + (alice1.equals(bob)));
      
      System.out.println(bob.toString());
     }
    }
      
    class Employee {
     public Employee(String n, double s, int year, int month, int day) {
      name = n;
      salary = s;
      GregorianCalendar calendar = new GregorianCalendar(year, month, day);
      hireDay = calendar.getTime();
     }
      
     public String getName() {
      return name;
     }
      
     public double getSalary() {
      return salary;
     }
      
     public Date getHireDay() {
      return hireDay;
     }
      
     public void raiseSalary(double byPercent) {
      double raise = salary * byPercent / 100;
      salary += raise;
     }
      
     @Override
     public boolean equals(Object otherObject) {
      // a quick test to see if the objects are identical
      if (this == otherObject)
       return true;
      
      // must return false if the explicit parameter is null
      if (otherObject == null)
       return false;
      
      // if the classed don't match,they can't be equal
      if (getClass() != otherObject.getClass())
       return false;
      
      // now we know otherObject is a non-null Employee
      Employee other = (Employee) otherObject;
      
      // test whether the fields hava identical values
      return name.equals(other.name) && salary == other.salary
        && hireDay.equals(other.hireDay);
      
     }
      
     @Override
     public int hashCode() {
      return 7 * name.hashCode() + 11 * new Double(salary).hashCode() + 13
        * hireDay.hashCode();
     }
      
     @Override
     public String toString() {
      return getClass().getName() + "[name=" + name + ",salary=" + salary
        + ",hireDay=" + hireDay + "]";
     }
      
     private String name;
     private double salary;
     private Date hireDay;
    }
      
    class Manager extends Employee {
     public Manager(String n, double s, int year, int month, int day) {
      super(n, s, year, month, day);
      bouns = 0;
     }
      
     @Override
     public double getSalary() {
      double baseSalary = super.getSalary();
      return baseSalary + bouns;
     }
      
     public void setBouns(double b) {
      bouns = b;
     }
      
     @Override
     public boolean equals(Object otherObject) {
      if (!super.equals(otherObject))
       return false;
      Manager other = (Manager) otherObject;
      // super equals checked that this and other belong to the same class
      return bouns == other.bouns;
     }
      
     @Override
     public int hashCode() {
      return super.hashCode() + 17 * new Double(bouns).hashCode();
     }
      
     @Override
     public String toString() {
      return super.toString() + "[bouns=" + bouns + "]";
     }
      
     private double bouns;
    }

    equals() 与 == 的区别是什么?

    == : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。

    equals() : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况:

    下面,通过示例比较它们的区别。

    代码如下:

    import java.util.*;
    import java.lang.Comparable;
     
    /**
     * @desc equals()的测试程序。
     */
    public class EqualsTest3{
     
     public static void main(String[] args) {
      // 新建2个相同内容的Person对象,
      // 再用equals比较它们是否相等
      Person p1 = new Person("eee", 100);
      Person p2 = new Person("eee", 100);
      System.out.printf("p1.equals(p2) : %s\n", p1.equals(p2));
      System.out.printf("p1==p2 : %s\n", p1==p2);
     }
     
     /**
      * @desc Person类。
      */
     private static class Person {
      int age;
      String name;
     
      public Person(String name, int age) {
       this.name = name;
       this.age = age;
      }
     
      public String toString() {
       return name + " - " +age;
      }
     
      /**
       * @desc 覆盖equals方法
       */
      @Override
      public boolean equals(Object obj){
       if(obj == null){
        return false;
       }
     
       //如果是同一个对象返回true,反之返回false
       if(this == obj){
        return true;
       }
     
       //判断是否类型相同
       if(this.getClass() != obj.getClass()){
        return false;
       }
     
       Person person = (Person)obj;
       return name.equals(person.name) && age==person.age;
      }
     }
    }

    运行结果:

    p1.equals(p2) : true
    p1==p2 : false

    结果分析:

    在EqualsTest3.java 中:

    更多编程相关知识,请访问:编程教学!!

    以上就是java equals()方法怎么用的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:equals() java
    上一篇:java有哪三大特性 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • java中值传递和引用传递的区别是什么• java接口的修饰符可以是什么• java实现多线程的几种方式• java最常用的技术栈有哪些• java注释有哪三种形式
    1/1

    PHP中文网