集合类List去除重复元素

 一个很常有且简单的问题,去除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的方法

 全是一些小知识,理解的不对,请指出,共同成长~

猜你喜欢

转载自lynbazinga.iteye.com/blog/2164094