java List实体类的比较,contains和equals,无需重写点击即用

业务需求,有时候我们会需要比较当前的实体类的值是否和数据库查出来的某一条数据相同。
最初我以为直接用List.contains就可以比较,但是!俺们实际操作一下。

// 介是实体类
public class Employee {
  private Integer id;
  private String name;
  private String gender;
  private Long localId;


  public Employee(Integer id, String name, String gender, Long localId) {
    this.id = id;
    this.name = name;
    this.gender = gender;
    this.localId = localId;
  }
}
// 介是测试
public static void main(String[] args) {

    List<Employee> employeeList = new ArrayList<Employee>();

    employeeList.add(new Employee(1, "野兽先辈", "男", 114514L));
    employeeList.add(new Employee(2, "Van♂", "男", 55555L));
    employeeList.add(new Employee(3, "油咖喱", "女", 1700000005L));
    employeeList.add(new Employee(4, "秧歌思达", "男", 515151L));

    Employee employee = new Employee(3, "油咖喱", "女", 1700000005L);


    System.out.println(employeeList.contains(employee));


  }

在这里插入图片描述
好家伙,实际的情况是,false,这么说是完全不同噢,但是我们对比造的数据,第三条应该是一毛一样的。所以这样使用肯定是不对的。
查询资料和dalao们整理的发现,contains里属性值是比较的地址而不是值。要符合业务要求,就得在实体类中重写equals方法。但是,重写equals方法同时也必须重写hash,一套流程下来属实麻烦。所以自己试着写了个方法,只要部分匹配List的字段,我们就认为是相同的。

private static <T> boolean contains(final List<T> list, final Object ohter) throws IllegalAccessException {
    Field[] aim = ohter.getClass().getDeclaredFields();
    for (T t : list) {
      Field[] fields = t.getClass().getDeclaredFields();
      int count = 0;
      for (Field value : aim) {
        if (!value.isAccessible()) {
          value.setAccessible(true);
        }
        for (Field field : fields) {
          if (!field.isAccessible()) {
            field.setAccessible(true);
          }
          if (value.getName().equals(field.getName()) &&
              Objects.equals(value.get(ohter), field.get(t))) {
            count++;
          }
        }
        if (count == aim.length) {
          return true;
        }
      }
    }
    return false;
  }

我们实验试试:
在这里插入图片描述
下面的方法就会返回true了,我们改改数据试试
在这里插入图片描述很好,只要实体里的数据有一个不同,就会返回false。符合我们的预期。
因为在方法里是通过名称比较的,所以,哪怕不是一个类,只要属性名相同。都可以使用。

PS:其实真正使用并不需要那么复杂,只是为了做泛型才不得不去使用反射。如果就用一两次,我建议直接把实体写死,这样方法就会很干净整洁,满足需求。
希望有dalao指点,优化一下。

(重写!重写你打夜,很多时候业务规范,PO、VO不能有这些花里胡哨的东西,而要用List的contains就得在实体类里重写equals方法,所以为了避免就在调用的方法里这样写咯)

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 重写hashCode()和equals()方法是为了在集合中更好地管理和比较实体类的对象。在使用HashSet、HashMap等集合时,如果没有重写hashCode()和equals()方法,则会以对象的地址来比较对象是否相同,而不是对象的实际内容。因此重写这两个方法可以更好地管理和比较实体类的对象。 ### 回答2: 在Java中,实体类需要重写hashCode()和equals()方法的原因是为了保证对象在集合中的正确使用,尤其是在使用哈希表(如HashMap、HashSet等)存储对象时。 首先,hashCode()方法用于计算对象的哈希码,它是一个int类型的数值。哈希码一般是根据对象的属性值计算得出的,且具有唯一性。在使用哈希表存储对象时,哈希码可以作为索引来快速定位对象,从而提高查询效率。因此,如果实体类中的属性发生改变,而hashCode()方法没有被重写,则同一对象的哈希码可能会发生改变,从而导致在哈希表中无法正确找到对象或获取对象的值。 其次,equals()方法用于比较两个对象是否相等。默认情况下,equals()方法是使用对象的引用进行比较的,即只有两个对象的引用指向同一块内存地址时才会返回true。但在实际应用中,我们通常需要根据对象的属性值进行相等性比较。因此,我们需要重写equals()方法,根据实体类中的属性值来判断对象是否相等。这样,在使用集合类存储对象时,集合类可以通过equals()方法来判断对象是否存在,从而保证集合中不存在重复的对象。 综上所述,重写hashCode()和equals()方法是为了确保对象在集合中的正确使用。通过重新定义这两个方法,我们可以根据实体类的属性值来计算哈希码,从而能够在集合中正确地查找和比较对象,提高程序的效率。 ### 回答3: 在Java中,实体类通常用于表示具体的实体对象,如用户、订单等。而重写`hashCode()`和`equals()`方法是为了实现对象在集合中的比较和查找。 首先,`hashCode()`方法用于获取对象的哈希码(hash code)。哈希码是一个整数值,用于快速地定位对象在哈希表中的存储位置。当我们将对象存入HashSet、HashMap、HashTable等集合时,这些集合会根据对象的哈希码决定存储位置,以便快速查找和比较。如果两个对象的`hashCode()`方法返回的结果不同,那么集合会认为这两个对象是不同的。因此,如果我们在自定义的实体类中使用了集合(如Set、Map)来保存实例对象,就需要重写`hashCode()`方法来确保对象的合理存储和比较。 而`equals()`方法用于比较两个对象是否相等。在默认情况下,`equals()`方法会比较对象的指针地址,即只有当两个对象的引用指向同一个内存地址时才认为它们是相等的。然而,很多时候我们并不仅仅希望判断对象的地址是否相同,而是根据对象的特定属性来判断它们是否相等。因此,我们需要重写`equals()`方法,自定义对象的相等条件。一般而言,我们需要重写`equals()`方法的同时也重写`hashCode()`方法,以保证在集合中使用时的一致性和正确性。 总的来说,通过重写`hashCode()`和`equals()`方法,能够确保对象在集合中的正确存储和比较。这样,我们就能够根据对象的特定属性来进行查找、删除、更新等操作,而不仅仅局限于对象的内存地址比较

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值