📜  如何在不定义 equals() 和 hashCode() 的情况下比较自定义类的列表? - Java (1)

📅  最后修改于: 2023-12-03 14:52:53.643000             🧑  作者: Mango

如何在不定义 equals() 和 hashCode() 的情况下比较自定义类的列表? - Java

在 Java 中,当我们对自定义类进行列表操作时,比较通常是通过 equals() 和 hashCode() 方法来实现的。这两个方法帮助确定对象的相等性和散列码,这样列表就可以通过这些值来确定是否存在相同的对象。

不过有时候,我们不想或无法定义这两个方法,那么该怎么办呢?本文介绍了如何在不定义 equals() 和 hashCode() 的情况下比较自定义类的列表。

1. 使用Comparator进行比较

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() 方法了。

2. 使用类的属性进行比较

另一种比较自定义类的方法是根据类的某些属性进行比较。例如,考虑下面的 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() 方法。这使得比较列表的元素变得更加灵活和容易。