📅  最后修改于: 2023-12-03 14:52:53.643000             🧑  作者: Mango
在 Java 中,当我们对自定义类进行列表操作时,比较通常是通过 equals() 和 hashCode() 方法来实现的。这两个方法帮助确定对象的相等性和散列码,这样列表就可以通过这些值来确定是否存在相同的对象。
不过有时候,我们不想或无法定义这两个方法,那么该怎么办呢?本文介绍了如何在不定义 equals() 和 hashCode() 的情况下比较自定义类的列表。
Comparator 接口是一个功能强大的接口,它可以在不修改自定义类的情况下进行比较。可以通过创建一个新的类,该类实现 Comparator 接口来定义比较器。
以下是一个自定义类的例子:
public class Book {
private String name;
private String author;
private int pages;
// constructors, getters and setters
}
然后我们可以创建一个名为 BookComparator 的比较器来对 Book 实例进行比较,该比较器比较 Book 的 pages 属性:
public class BookComparator implements Comparator<Book> {
@Override
public int compare(Book b1, Book b2) {
return b1.getPages() - b2.getPages();
}
}
最后,我们将比较器传递给列表的 sort() 方法来对列表进行排序:
List<Book> books = new ArrayList<>();
// add some books
Collections.sort(books, new BookComparator());
这样我们就可以对自定义类的列表进行比较而不需要定义 equals() 和 hashCode() 方法了。
另一种比较自定义类的方法是根据类的某些属性进行比较。例如,考虑下面的 Person 类:
public class Person {
private String name;
private int age;
// constructors, getters and setters
}
如果我们想根据 Person 的 age 属性进行比较,我们可以使用 lambda 表达式来对列表进行排序:
List<Person> people = new ArrayList<>();
// add some people
people.sort(Comparator.comparing(Person::getAge));
这样我们就可以按照 age 属性对自定义类的列表进行比较了。
根据需要,我们可以使用 Comparator 或 lambda 表达式来对自定义类的列表进行比较,而不需要定义 equals() 和 hashCode() 方法。这使得比较列表的元素变得更加灵活和容易。