文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

java equals()方法如何使用

2023-07-04 23:11

关注

这篇文章主要介绍了java equals()方法如何使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇java equals()方法如何使用文章都会有所收获,下面我们一起来看看吧。

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

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

java equals()方法如何使用

简单的说,当比较字符串常量时,等于和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; 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); }   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;  }     @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) : truep1==p2 : false

结果分析:

在EqualsTest3.java 中:

关于“java equals()方法如何使用”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“java equals()方法如何使用”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注编程网行业资讯频道。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯