`
LynBazinga
  • 浏览: 11034 次
社区版块
存档分类
最新评论

集合类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的方法

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

 

 

 

分享到:
评论

相关推荐

    Java集合框架List接口.pdf

    Java集合框架中的List接口是一种有序的集合,它可以存储重复的元素。它是Collection接口的子接口,提供了一系列可以对列表进行操作的方法,如添加、插入、删除、获取元素等。List接口还可以通过索引访问元素,类似于...

    JAVA集合(List,Set,Map)

    可扩展为自定义集合类。 实现类:8个实现类(实线表示),对接口的具体实现。 在很大程度上,一旦您理解了接口,您就理解了框架。虽然您总要创建接口特定的实现,但访问实际集合的方法应该限制在接口方法的使用上...

    40道java集合面试题含答案(很全很详细)

    List接口提供了按照索引位置访问元素的方法,以及添加、删除和修改元素的操作。List接口的实现类包括ArrayList、LinkedList等。 Set接口是无序的集合,元素不能重复。Set接口的实现类包括HashSet、LinkedHashSet等...

    Java集合框架Collection接口.pdf

    其中,List是一个有序的集合,可以包含重复的元素;而Set是一个不重复的集合,元素是无序的。 Collection接口的常用方法 1、add(Object obj):向集合中添加一个元素obj; 2、addAll(Collection c):将集合c中的所有...

    Java集合框架.pdf

    1、Collection接口 Collection接口是所有集合类的父接口,它定义了集合的基本操作,如添加、删除、遍历等。Collection接口有两个重要的子接口:List和Set。 2、List接口 List接口是有序集合,可以存储重复元素。它...

    [详细完整版]数据结构05.doc

    第五章 线性表和串习题 5.1若将顺序表中记录其长度的分量listlen改为指向最后一个元素的位置last,在实 现各基本运算时需要做那些修改? 5.2试用顺序表表示较多位数的大整数,以便于这类数据的存储。请选择合适的...

    List、Set、Map的特点及遍历方法

    List、Set、MapList与Set集合的区别List、Map、Set三个接口,存取元素时,各有什么特点SetListMapList、Set、Map遍历的实现先来个Employee实体类List遍历的三种方式Set遍历的两种方式Map的几种遍历 List与Set集合的...

    Java集合1

    Java集合Collection接口List接口重复有序List接口的主要实现类,底层用数组实现优点访问速度快缺点插入和删除开销大:增加和删除元素时,需要对整个

    java面试宝典

    65、Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别 17 66、HashMap和Hashtable的区别 17 67、说出ArrayList,Vector, LinkedList的存储性能和特性 17 68、java中有几...

    Java中集合相关知识点复习

    ArrayList是一种变长的集合类,基于定长数组实现,使用默认构造方法初始化出来的容量是10(1.7之后都是延迟初始化,即第一次调用add方法添加元素的时候才将elementData容量初始化为10) ArrayList允许空值和重复元素...

    Java面试宝典2010版

    68、你所知道的集合类都有哪些?主要方法? 69、两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对? 70、TreeSet里面放对象,如果同时放入了父类和子类的实例对象,那比较时使用的是...

    基于javatcpsocket通信的拆包和装包源码-all-in-one:知识点总结

    List集合是有序集合,集合中的元素可以重复,访问集合中的元素可以根据元素的索引来访问,查找元素效率高,插入删除效率低。 Set集合是无序集合,集合中的元素不可以重复,检索效率低下,删除和插入效率高,访问集合...

    大数据面试题.pdf

    ⽼掉⽛的问题了,还在这⾥⽼⽣常谈:List特点:元素有放⼊顺序,元素可重复 ,Set特点:元素⽆放⼊顺序,元素不可重复。 1-2)数据库的三⼤范式? 原⼦性、⼀致性、唯⼀性 1-3)java 的io类的图解 1-4)对象与引⽤...

    JAVA.SE List,collections,set接口

    文章目录1List接口1.1 Array List1.2LInkedList2.collections类2.1是一个集合工具类,内部保存的是静态方法2.2可变参数3.set接口3.1set接口的特点3.2hashSet3.3LinkedHashSet3.4TreeSet. 1List接口 List接口继承...

    java 面试题 总结

     Collection是集合类的上级接口,继承与他的接口主要有Set 和List. Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 10、&和&&的区别。 &是位运算符...

    超级有影响力霸气的Java面试题大全文档

     Collection是集合类的上级接口,继承与他的接口主要有Set 和List. Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作。 13、&和&&的区别。 &是位运算符...

    JAVA面试题最全集

    数据结构,如何遍历List中的元素? 如果要按照键值保存或者访问数据,使用什么数据结构? 要掌握Collection相关的接口和类的使用 56.使用StringBuffer类与String类进行字符串连接时有何区别? 57.调用Thread类的...

    《数据结构 1800题》

    2. 对于给定的 n个元素,可以构造出的逻辑结构有 (1)集合 , (2)线性结构 , (3)树型结构 ,_图状结构_(4)_四种。 【中科院计算所 1999 二、1(4分)】 3.数据的逻辑结构是指(数据的组织形式,即数据元素...

Global site tag (gtag.js) - Google Analytics