一个很常有且简单的问题,去除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的方法
全是一些小知识,理解的不对,请指出,共同成长~