equals 方法的详细用法

equals 方法是 Java 中用于比较两个对象是否“相等”的方法,属于 Object 类。因为所有类都直接或间接继承自 Object,所以每个类都有 equals 方法。

以下是对 equals 方法的详细讲述:


1. equals 的定义

equals 方法定义在 java.lang.Object 类中:

public boolean equals(Object obj) { return (this == obj); }
  • 默认实现是比较两个对象的内存地址(引用地址),只有当两个引用指向同一个对象时才返回 true
  • 通常会被子类(如 StringInteger 等)重写,用于比较实际的值是否相等。

2. equals 的基本用法

(1)用于比较基本对象

Object obj1 = new Object(); Object obj2 = new Object(); System.out.println(obj1.equals(obj2)); // 输出 false,因为它们是不同的对象。 Object obj3 = obj1; System.out.println(obj1.equals(obj3)); // 输出 true,因为它们是同一个引用。

(2)用于字符串比较

String 类重写了 equals 方法,用于比较字符串的内容是否相同:

String str1 = "hello"; String str2 = "hello"; System.out.println(str1.equals(str2)); // 输出 true,内容相同。

(3)用于包装类比较

包装类(如 IntegerDouble 等)也重写了 equals 方法,用于比较值是否相等:

Integer num1 = 100; Integer num2 = 100; System.out.println(num1.equals(num2)); // 输出 true,值相等。

3. equals 的使用场景

(1)基本对象的引用比较

如果没有重写 equals,它默认比较引用地址是否相同。

(2)集合中的对象比较

在集合中,如 ListSet,会使用 equals 方法来判断元素是否重复。例如:

Set<String> set = new HashSet<>(); set.add("A"); set.add("A"); System.out.println(set.size()); // 输出 1,因为字符串 "A" 被认为是相等的。

(3)自定义类的值比较

对于自定义类,如果需要比较对象的内容,而非引用地址,通常需要重写 equals 方法。


4. 重写 equals 方法

(1)标准实现

在重写 equals 方法时,需要遵守以下规则:

  1. 自反性x.equals(x) 必须返回 true
  2. 对称性x.equals(y)y.equals(x) 必须一致。
  3. 传递性:如果 x.equals(y)y.equals(z)true,则 x.equals(z) 也必须为 true
  4. 一致性:多次调用 x.equals(y) 的结果必须一致。
  5. null 比较:任何对象与 null 比较必须返回 false

(2)示例代码

假设有一个 Person 类,包含 nameage 两个字段,重写 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); } }

使用示例:

Person p1 = new Person("Alice", 25); Person p2 = new Person("Alice", 25); System.out.println(p1.equals(p2)); // 输出 true,因为字段相同。

5. 与 == 的区别

equals ==
比较的是对象的内容(通常需要重写)。 比较的是对象的内存地址(引用地址)。
用于判断两个对象是否“值相等”。 用于判断两个引用是否指向同一个对象。

示例:

String str1 = new String("hello"); String str2 = new String("hello"); System.out.println(str1 == str2); // 输出 false,不是同一个引用。 System.out.println(str1.equals(str2)); // 输出 true,内容相同。

6. equals 方法的注意事项

(1)比较时避免 NullPointerException

使用 equals 时,最好确保调用方不为空。如果不确定,可以使用常见的 常量在前 写法:

String str = null; System.out.println("hello".equals(str)); // 输出 false,避免空指针异常。

(2)与 hashCode 一起重写

当重写 equals 方法时,通常也需要重写 hashCode 方法,否则可能导致集合操作出现问题。例如:

  • HashSetHashMap 中,equalshashCode 必须一致。

7. 常见实现类的 equals 行为

(1)String

比较字符串的内容:

String str1 = "hello"; String str2 = new String("hello"); System.out.println(str1.equals(str2)); // 输出 true。

(2)Integer

比较数值是否相等:

Integer num1 = 100; Integer num2 = 100; System.out.println(num1.equals(num2)); // 输出 true。

(3)ArrayListHashSet

比较集合中的元素是否相等:

List<String> list1 = Arrays.asList("A", "B"); List<String> list2 = Arrays.asList("A", "B"); System.out.println(list1.equals(list2)); // 输出 true。

总结

  • equals 方法用于判断两个对象是否相等,默认实现是比较引用地址。
  • 通常需要在自定义类中重写,用于比较实际值。
  • == 不同,equals 更适合用于值比较。
  • 在集合框架中广泛应用,需要与 hashCode 方法配合重写以保证一致性。

__EOF__

本文作者258333
本文链接https://www.cnblogs.com/258-333/p/18616408.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   258333  阅读(145)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)
点击右上角即可分享
微信分享提示