一个很常有且简单的问题,去除List<Entity>中的重复值,整理一下:
package com.list; public class Person { /** * 居民身份证 */ private Long personId; /** * 姓名 */ private String name; /** * 年龄 */ private int age; public Long getPersonId() { return personId; } public void setPersonId(Long personId) { this.personId = personId; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public String toString() { return "Person [personId=" + personId + ", name=" + name + ", age=" + age + "]"; } @Override public int hashCode() { return personId != null ? personId.hashCode():0; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null || getClass() != obj.getClass()) return false; Person p = (Person)obj; if( getPersonId().equals(p.getPersonId()) && getName().equals(p.getName()) && getAge() == p.getAge()) return true; return false; } }
方法equals是比较两个对象的内存地址是否一样,这很好解释,感觉根据面向对象的原则,没有两个完全一模一样的对象存在,不过为了在编码中实现各种业务需求,有时必须重写equals的方法
重写hashcode,equals的原则:
1)能不重写equals和hashcode的情况下,尽量避免hashcode和equals的重写
2)重写equals必须重写hashcode
3)重写完hashcode方法后,避免改变参与计算hashcode的那些Entity的属性的值,否则会发生一些意外的事情,例如list.remove,hashset中的一些方法的异常
测试代码如下:
package com.list; import java.util.ArrayList; import java.util.List; import org.junit.Before; public class Test { private List<Person> persons = null; private Person p1,p2,p3; @Before public void before(){ persons = new ArrayList<Person>(); p1 = new Person(); p1.setPersonId(123456L); p1.setName("zhangsan"); p1.setAge(11); p2 = new Person(); p2.setPersonId(123456L); p2.setName("zhangsan"); p2.setAge(11); p3 = new Person(); p3.setPersonId(123457L); p3.setName("lisi"); p3.setAge(12); persons.add(p1); persons.add(p2); persons.add(p3); } @org.junit.Test public void test(){ List<Person> personList = new ArrayList<Person>(); if(null != persons){ for(Person p:persons) if( !personList.contains(p) ){ personList.add(p); } } System.out.println(personList.size()); } }
对大多是的list的操作中,例如list.contains操作中,先比较hashcode如果相等,再比较equals的方法
全是一些小知识,理解的不对,请指出,共同成长~