使用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