当您覆盖任何对象中的 equals 方法时,您可以完美地检查该对象与另一个对象的相等性即使它们位于内存中的不同位置。
所以下面的代码
myList.contains(myObject);
如果在 myList 中有一个对象,其 equals 方法使用 myObject 返回 true,则将作出响应。
在所有主要的 IDE(如 intelliJ、netbeans、eclipse 等)中,IDE 将帮助您准确地覆盖 equals 方法。这是使用 intelliJ IDE
覆盖 equals 方法的自动生成代码
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Details details = (Details) o;
return Objects.equals(name, details.name) &&
Objects.equals(email, details.email);
}
现在,如果您想避免在列表中添加重复项,您应该使用 Set 而不是 List。 >Set 将添加一个新元素如果 hashCode 和 equals 方法的组合不同(比较现有对象和新预期添加对象)
所以我们必须重写 hashCode 方法(由 intelliJ IDE 生成)如果我们想使用 Set 类的风格:
@Override
public int hashCode() {
return Objects.hash(name, email);
}
现在,如果您创建一个集合并尝试在该集合中添加两个具有相似名称和电子邮件的对象,该集合将仅添加第一个唯一名称和电子邮件地址,即使第二个对象的其他字段有不同的值
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;
class Details {
String name;
String age;
String email;
String location;
public Details(String name, String age, String email, String location) {
this.name = name;
this.age = age;
this.email = email;
this.location = location;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Details details = (Details) o;
return Objects.equals(name, details.name) &&
Objects.equals(email, details.email);
}
@Override
public int hashCode() {
return Objects.hash(name, email);
}
@Override
public String toString() {
return String.format("(name: %s, age: %s, email: %s, location: %s)", name, age, email, location);
}
public static void main(String[] args) {
Set<Details> mySet = new HashSet<>();
mySet.add(new Details("Mehdi", "12", "123@xyz.com", "Los Angeles"));
mySet.add(new Details("Mehdi", "34", "123@xyz.com", "Las Vegas"));
System.out.println(mySet);
}
}
这是整个测试应用程序。还有其他值得一提的。如果在任何情况下您已将数据保存在列表中,并且您想根据您拥有的规则(例如姓名、电子邮件)删除重复项,您可以尝试这种方法:
Set<Details> mySet = new HashSet<>(myList);
哪个 myList 是你的列表。 所以在你的应用中会是这样的:
public static void main(String[] args) {
List<Details> myList = new ArrayList<>();
myList.add(new Details("Mehdi", "12", "123@xyz.com", "Los Angeles"));
myList.add(new Details("Mehdi", "34", "123@xyz.com", "Las Vegas"));
Set<Details> mySet = new HashSet<>(myList);
System.out.println(mySet);
}
这是没有任何重复的结果:
[(姓名:Mehdi,年龄:12,电子邮件:123@xyz.com,地点:洛杉矶)]