0

我正在尝试使用 DiffUtils 回调实现 RecyclerView ListAdapter,以仅更新/插入已更改的行而不是全部。要实现,我必须从 diff utils areItemsTheSameareContentsTheSame. 我可以检查areItemsTheSame使用从 db 获得的每个对象的 id。但是因为areContentsTheSame我不想编写 equals 函数并用.equals方法或类似方法匹配每个字段。我想知道我可以使用类中的默认 hashCode 函数吗?如果不能,我可以像这样覆盖 hashCode 函数吗?

public class Person {
  String name;
  String surname;
  String country;
  int age;    

  public Person(String name, String surname, String country, int age) {
      this.name = name;
      this.surname = surname;
      this.country = country;
      this.age = age;
  }

  @Override
  public int hashCode() {
      int prime=31;
      int sum = prime*this.name.hashCode();
      sum=sum+this.surname.hashCode();
      sum=sum+this.country.hashCode();
      sum=sum+this.age;
      return sum;
  }

}


4

1 回答 1

0

Java 文档声明如下:

如果两个对象根据 equals(Object) 方法相等,则对两个对象中的每一个调用 hashCode 方法必须产生相同的整数结果。

如果根据 equals(java.lang.Object) 方法,如果两个对象不相等,则不需要对两个对象中的每一个调用 hashCode 方法都必须产生不同的整数结果。

因此,hashCode()考虑到为不同对象生成的整数可能具有相同值的概率,仅使用函数来检查相等性可能会给出错误的结果。

如果您担心有一个equals()比较每个字段的长方法,您只能比较对相等性很重要的字段。

于 2020-02-12T01:33:27.377 回答