使用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()方法结果:


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM