当我们在Java中处理对象时,判断两个对象是否相等(equality)是一个很普遍的问题,《Java中判断对象是否相等的equals()方法使用教程》提供了一个详细的攻略,帮助我们更好地理解在Java中使用equals()方法。
一、如何判断对象是否相等
在Java中,判断对象是否相等并不能简单地使用“==”运算符。在Java中,对象实际上是存储在内存中的,只有在相同的内存地址中找到的对象才是相等的。但在很多情况下,对象的值相等但是却不在同一个内存地址中,因此在Java中有一个专门用于判断对象是否相等的方法,那就是equals()
方法。
二、equals()方法的使用
equals()
方法是一个Java中的常用方法,它用来判断两个对象是否相等,如果相等返回true
,如果不相等返回false
。
它的基础语法结构为:
public boolean equals(Object obj)
其中参数obj
是我们要比较的对象。注意,这里传入的参数类型为Object
,因为Java中所有的对象都是Object类的子类,所以所有的Java对象都可以调用equals()
方法。但是需要注意的是,如果两个对象的类型不同,那它们一定不相等,equals()
方法会返回false
。
三、重写equals()方法的注意事项
在使用equals()
方法时,我们也需要注意一些事项。首先我们需要知道的是:当我们定义自己的类时,如果我们想要在这个类中使用equals()
方法,那么我们需要重写equals()
方法,否则使用默认的Object
类的equals()
方法,相当于是比较对象的内存地址,而不是比较它们的值。
其次,添加equals()
方法之后,我们往往也需要重写hashCode()
方法,因为当我们把对象插入到HashMap或者HashSet等集合类中时,集合类会使用对象的hashCode值来比较它们是否相等,而使用默认的hashCode()
方法通常会导致效率低下。
最后,重写equals()
方法时,我们需要注意以下几点:
equals()
方法必须具有对称性(symmetric),即:a.equals(b)必须和b.equals(a)具有相同的结果。equals()
方法必须具有传递性(transitive),即:如果a.equals(b),且b.equals(c),那么a.equals(c)也必须返回true
。equals()
方法必须具有一致性(consistent),即:如果比较的对象没有被改变,那么重复调用equals()
方法必须返回相同的结果。equals()
方法必须返回false
,如果传递给它的参数为null
。equals()
方法必须和hashCode()
方法一起被重写。
四、示例说明
示例一
下面是一个使用equals()
方法的示例:
public class Person {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Person person = (Person) obj;
return age == person.age && Objects.equals(name, person.name);
}
}
public class Main {
public static void main(String[] args) {
Person person1 = new Person("Tom", 18);
Person person2 = new Person("Tom", 18);
System.out.println(person1.equals(person2)); // true
}
}
在这个示例中,我们创建了一个Person
类,并重写了equals()
方法。在equals()
方法中,我们判断了如果两个对象的内存地址相同,那么它们一定相等;如果两个对象的类型不同,那么它们一定不相等;最后,如果两个对象的age属性相等且name属性相等,那么它们相等。
在main方法中,我们创建了两个Person对象,它们的属性完全相同,使用equals()
方法比较它们的值时,返回的结果为true
。
示例二
下面是一个实现自定义equals()
方法和hashCode()
方法的示例:
public class Student {
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
Student student = (Student) obj;
return age == student.age && Objects.equals(name, student.name);
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
}
public class Main {
public static void main(String[] args) {
Student s1 = new Student("Tom", 18);
Student s2 = new Student("Tom", 18);
System.out.println(s1.equals(s2)); // true
Set<Student> set = new HashSet<>();
set.add(s1);
set.add(s2);
System.out.println(set.size()); // 1
}
}
在这个示例中,我们创建了一个Student
类,并重写了equals()
方法和hashCode()
方法。在equals()
方法中,我们判断了当两个Student对象的name属性和age属性都相同时,它们相等;而在hashCode()
方法中,我们使用Objects
类的hash()
方法来计算hash值。
在main方法中,我们创建了两个Student对象,它们的属性完全相同,使用equals()
方法比较它们的值时,返回的结果为true
。接着,我们将这两个Student对象放入一个HashSet集合中,因为我们重写了hashCode()
方法,所以它们的hash值相等,而重写了equals()
方法,所以它们相等,那么它们只会被放入HashSet集合中的一个位置,最终HashSet集合的size值为1。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java中判断对象是否相等的equals()方法使用教程 - Python技术站