zoukankan      html  css  js  c++  java
  • 使用Set集合对List集合进行去重

    /**
    * 使用Set集合对List集合进行去重
    **/
    public class SetTest {
    /**
    * List集合的泛型为Integer类型
    *
    * @author hongwei.lian
    * @date 2018年3月9日 下午11:32:53
    */
    @Test
    public void testListToSet1() {
    List<Integer> list = new ArrayList<>();
    list.add(1);
    list.add(2);
    list.add(3);
    list.add(1);
    Set<Integer> set = new HashSet<>(list);
    System.out.println("list的个数为:" + list.size() + "个");
    list.forEach(System.out::println);
    System.out.println("set的个数为:" + set.size() + "个");
    set.forEach(System.out::println);
    }
    /**
    * List集合的泛型为String类型
    **/
    @Test
    public void testListToSet2() {
    List<String> list = new ArrayList<>();
    list.add("a");
    list.add("b");
    list.add("c");
    list.add("a");
    Set<String> set = new HashSet<>(list);
    System.out.println("list的个数为:" + list.size() + "个");
    list.forEach(System.out::println);
    System.out.println("set的个数为:" + set.size() + "个");
    set.forEach(System.out::println);
    }
    
    /**
    * List集合的泛型为自定义类型User
    * 需求是userCode一样的便是同一个对象
    **/
    @Test
    public void testListToSet3() {
    List<User> list = new ArrayList<>();
    list.add(new User(1,"用户一","600001"));
    list.add(new User(2,"用户二","600002"));
    list.add(new User(3,"用户一","600001"));
    list.add(new User(4,"用户一","600001"));
    Set<User> set = new HashSet<>(list);
    System.out.println("list的个数为:" + list.size() + "个");
    list.forEach(System.out::println);
    System.out.println("set的个数为:" + set.size() + "个");
    set.forEach(System.out::println);
    }
    }

     

    上面测试使用到的User类源码:

    package com.qdfae.jdk.domain;
    
    import java.io.Serializable;
    
    /**
    * User实体类
    *
    * @author hongwei.lian
    * @date 2018年3月10日 上午12:33:22
    */
    public class User implements Serializable {
    private static final long serialVersionUID = -7629758766870065977L;
    
    /**
    * 用户ID
    */
    private Integer id;
    /**
    * 用户姓名
    */
    private String userName;
    /**
    * 用户代码
    */
    private String userCode;
    public User() {}
    public User(Integer id, String userName, String userCode) {
    this.id = id;
    this.userName = userName;
    this.userCode = userCode;
    }
    
    public Integer getId() {
    return id;
    }
    
    public void setId(Integer id) {
    this.id = id;
    }
    
    public String getUserName() {
    return userName;
    }
    
    public void setUserName(String userName) {
    this.userName = userName;
    }
    
    public String getUserCode() {
    return userCode;
    }
    
    public void setUserCode(String userCode) {
    this.userCode = userCode;
    }
    
    @Override
    public String toString() {
    return "User [id=" + id + ", userName=" + userName + ", userCode=" + userCode + "]";
    }
    }

    依次运行上面三个方法的结果是:
    testListToSet1()方法结果:

     

    testListToSet2()方法结果:

     

    testListToSet3()方法结果:

    上面的testListToSet1()方法和testListToSet2()方法可以去重,那为什么testListToSet3()方法就不能去重呢?仔细想想就会知道,两个对象的地址值不一样,怎么会认为是相同的去重呢,再往深处想,就会想到Object类的hashCode()方法和equals()方法,这两个方法决定了两个对象是否相等。Integer类和String类之所以可以进行去重,是因为这两个类都重写了父类Object类中的hashCode()方法和equals()方法,具体的代码可以去查看JDK源码,这里不再赘述。到这里我们就知道User对象不能去重的原因所在,那么我们根据需求在User类中重写hashCode()方法和equals()方法

    /**
    * User实体类
    *
    */
    public class User implements Serializable {
    private static final long serialVersionUID = -7629758766870065977L;
    
    /**
    * 用户ID
    */
    private Integer id;
    /**
    * 用户姓名
    */
    private String userName;
    /**
    * 用户代码
    */
    private String userCode;
    public User() {}
    public User(Integer id, String userName, String userCode) {
    this.id = id;
    this.userName = userName;
    this.userCode = userCode;
    }
    
    public Integer getId() {
    return id;
    }
    
    public void setId(Integer id) {
    this.id = id;
    }
    
    public String getUserName() {
    return userName;
    }
    
    public void setUserName(String userName) {
    this.userName = userName;
    }
    
    public String getUserCode() {
    return userCode;
    }
    
    public void setUserCode(String userCode) {
    this.userCode = userCode;
    }
    /**
    * 针对userCode重写hashCode()方法
    */
    @Override
    public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + ((userCode == null) ? 0 : userCode.hashCode());
    return result;
    }
    
    /**
    * 针对userCode重写equals()方法
    */
    @Override
    public boolean equals(Object obj) {
    if (this == obj)
    return true;
    if (obj == null)
    return false;
    if (getClass() != obj.getClass())
    return false;
    User other = (User) obj;
    if (userCode == null) {
    if (other.userCode != null)
    return false;
    } else if (!userCode.equals(other.userCode))
    return false;
    return true;
    }
    
    @Override
    public String toString() {
    return "User [id=" + id + ", userName=" + userName + ", userCode=" + userCode + "]";
    }
    }
    我们再次运行testListToSet3()方法结果:
  • 相关阅读:
    Java中的枚举与values()方法
    为什么要使用双亲委派机制?
    java中finalize()方法
    jdk中rt.jar的作用
    IDEA查看maven依赖树,找出冲突jar包,以及 exclusion 冲突的包
    Linux 环境下SQLPLUS 回退键无法使用处理方法
    Hive字段注释会显示成from deserializer
    LinkedList类的poll、pop等方法
    static代码块执行顺序
    机器学习--线性回归
  • 原文地址:https://www.cnblogs.com/pypua/p/10783701.html
Copyright © 2011-2022 走看看