1、对集合中的自动定义的对象去重:

  自定义Person类,同时复写hashCode和equals方法

package collection;

public class Person {

    private String username;

    private String password;

    public Person() {
super();
} public Person(String username, String password) {
super();
this.username = username;
this.password = password;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} @Override
public String toString() {
return "Person [username=" + username + ", password=" + password + "]";
} @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result
+ ((password == null) ? 0 : password.hashCode());
result = prime * result
+ ((username == null) ? 0 : username.hashCode());
return result;
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (password == null) {
if (other.password != null)
return false;
} else if (!password.equals(other.password))
return false;
if (username == null) {
if (other.username != null)
return false;
} else if (!username.equals(other.username))
return false;
return true;
} }

测试去重代码:

@Test
public void test3(){ Person p1 = new Person("张三","zhangsan"); Person p2 = new Person("李四","lisi"); Person p3 = p1; Person p4 = p2; Person p5 = new Person("张三","zhangsan"); Person p6 = new Person("李四","lisi"); List<Person> list1 = new ArrayList<Person>();
list1.add(p1);
list1.add(p2);
list1.add(new Person("小周","xiaozhou"));
list1.add(p3);
list1.add(p4);
list1.add(new Person("小李","小李"));
list1.add(p5);
list1.add(p6);
logger.info(list1);
//Set<Person> set = new HashSet<Person>(list1); List<Person> list2 = new ArrayList<Person>();
if(list2.isEmpty()){
System.out.println("list2是空");
} for (Person person : list1) {
if (!(list2.contains(person))) {
list2.add(person);
}
}
// list1.clear();
// list1.addAll(list2);
logger.info(list2);
} @Test
public void test4(){ Set<Person> set = new LinkedHashSet<Person>();
set.add(new Person("张三", "zhangsan"));
set.add(new Person("张三", "zhangsan"));
set.add(new Person("张三", "12"));
set.add(new Person("李四", "21"));
set.add(new Person("李四", "21"));
set.add(new Person("李四", "45"));
set.add(new Person("王五", "23")); /*for (Iterator<Person> it = set.iterator(); it.hasNext();) {
Person person = it.next(); logger.info(person);
}*/ logger.info(set);
}

补充:

List和Set集合的区别在于:

list集合可以存在相同的元素,set集合则不能。但是同一个元素是根据对象在内存中地址的哈希吗来比较的,也就是说new出的每一个对象在内存中的地址都是不同的。所以set集合想要去重username和password相同的person对象,不一定是可以做到的,除非每次往集合中添加的对象,都是指向之前已经存在容器中对象地址的引用。所以这里我们要复写person类中的hashCode和equals方法。

同时我们又知道set集合中的hashset的数据结构是hash表(散列的数据结构),为了让去重后的set集合依然是有序的,所以这里可以使用hashset的子类linkedhashset,这样去重后的set集合是,有顺序的。

java中集合去重2的更多相关文章

  1. java中集合去重1

    //TreeMap 处理 处理后 得到的值 按拼音排序 TreeMap map = new TreeMap(new MaterialComparator()); map.put("东莞&qu ...

  2. Java中集合List,Map和Set的区别

    Java中集合List,Map和Set的区别 1.List和Set的父接口是Collection,而Map不是 2.List中的元素是有序的,可以重复的 3.Map是Key-Value映射关系,且Ke ...

  3. java中集合Collection转list对象

    参考:java中集合Collection转list对象 首先我的需求是获取到购物车列表,购物车列表是一个Map对象,构造方法获取购物项,这里购物项是Collection对象 // 购物项集合,K商品I ...

  4. JAVA中集合转数组遍历

    JAVA中集合的遍历的一种方法时集合转数组遍历,也是就调用Collection中的toArray(). 代码: public static void main(String[] args) {     ...

  5. Java中集合List,Map和Set的差别

    Java中集合List,Map和Set的差别 1.List和Set的父接口是Collection.而Map不是 2.List中的元素是有序的,能够反复的 3.Map是Key-Value映射关系,且Ke ...

  6. Java中集合的概述

    一.集合和数组的区别 1.数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 2.集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数 ...

  7. Java 单个集合去重与两个集合去重

    一.单个集合去重 描述: 去掉一个集合里重复的元素:将list集合转成hashSet集合,hashSet有自动去重的功能,再利用去重后的hashSet集合初始化一个新的list集合,此时这个list就 ...

  8. Scala中集合类型与java中集合类型转换

    对于java中的集合元素并不能在scala中拿来就用的,需要进行相应的转换. 1. 转换规则如下 从下面可以看出,有些可以相互转换的,有些只能单向转换: scala.collection.Iterab ...

  9. Java中集合关键字的区别

    1. ArrayList.Vector和Stack有什么区别? 1.ArrayList的方法和实现基本上和Vector一样,底层都是数组的实现(简:API基本一样) ​   2.Stack继承了Vec ...

随机推荐

  1. 如何利用Xshell在Linux下安装jdk

    本文会详细介绍如何在Linux下安装JDK1.8 首先要设置虚拟机的IP地址,不知道如何设置的话可以 翻看我的前一篇博客   http://www.cnblogs.com/xiaoxiaoSMILE/ ...

  2. lintcode-433-岛屿的个数

    433-岛屿的个数 给一个01矩阵,求不同的岛屿的个数. 0代表海,1代表岛,如果两个1相邻,那么这两个1属于同一个岛.我们只考虑上下左右为相邻. 样例 在矩阵: [ [1, 1, 0, 0, 0], ...

  3. lintcode-383-装最多水的容器

    383-装最多水的容器 给定 n 个非负整数 a1, a2, ..., an, 每个数代表了坐标中的一个点 (i, ai).画 n 条垂直线,使得 i 垂直线的两个端点分别为(i, ai)和(i, 0 ...

  4. 02_Java基础_第2天(变量、运算符)_讲义

    今日内容介绍 1.变量 2.运算符 01变量概述 * A: 什么是变量? * a: 变量是一个内存中的小盒子(小容器),容器是什么?生活中也有很多容器, * 例如水杯是容器,用来装载水:你家里的大衣柜 ...

  5. [2017BUAA软工]第三次博客作业:案例分析

    第三次博客作业:案例分析 1. 调研和评测 1.1 BUG及设计缺陷描述 主要测试博客园在手机端上的使用情况. [BUG 01] 不能后退到上一界面(IOS) 重现步骤:打开博客首页中任意博文,点击博 ...

  6. vue h render function & render select with options bug

    vue h render function & render select with options bug https://github.com/xgqfrms/vue/issues/41 ...

  7. Kafka发布订阅消息

    Maven <dependency> <groupId>org.apache.kafka</groupId> <artifactId>kafka-cli ...

  8. python的N个小功能(更新文件)

    ########################################################################## #对于第二份文件:第一份与第二份不相同,以第二份为 ...

  9. jmeter同步定时器

    同步定时器是jmeter中一个比较重要的定时器,同步定时器,相当于一个储蓄池,累积一定的请求,当在规定的时间内达到一定的线程数量,这些线程会在同一个时间点一起并发,可以用来做大数据量的并发请求. 验证 ...

  10. 【比赛】HNOI2018 毒瘤

    虚树+dp 直接看zlttttt的强大题解 zlttttt的题解看这里 #include<bits/stdc++.h> #define ui unsigned int #define ll ...