Java中List集合去重(二)
關於List中物件去重,如果List中儲存的資料型別是基本資料型別,可直接將list集合轉換成set集合,或採用其他方法,上篇有陳述。本篇說下list集合中的資料型別是一個物件型別的情況,需要在物件的實體類中去重寫equals()方法和hashCode()方法。
在該例中,我們將User實體類中使用者編碼和姓名作為判斷該物件重複的標識,在User實體類中我們重寫這兩個方法如下:
public class User {
private int id;
private String userCd;
private String userNm;
private String phone;
private String memo;
public User(int id, String userCd, String userNm, String phone, String memo) {
super();
this.id = id;
this.userCd = userCd;
this.userNm = userNm;
this.phone = phone;
this.memo = memo;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUserCd() {
return userCd;
}
public void setUserCd(String userCd) {
this.userCd = userCd;
}
public String getUserNm() {
return userNm;
}
public void setUserNm(String userNm) {
this.userNm = userNm;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getMemo() {
return memo;
}
public void setMemo(String memo) {
this.memo = memo;
}
@Override
public boolean equals(Object arg0) {
User u = (User) arg0;
return userCd.equals(u.userCd) && userNm.equals(u.userNm);
}
@Override
public int hashCode() {
String str = userCd + userNm;
return str.hashCode();
}
}
以上實體類中,我們在equals()方法中取出該物件的userCd和userNm這兩個屬性值去判斷比較,然後在重寫的hashCode()方法中返回這兩個屬性值得hashCode值。
package xuGroup.xuArtifact;
import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public class Test2 {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<User> userList = new ArrayList<User>();
userList.add(new User(1, "001", "張三", "13355556666", "前端"));
userList.add(new User(2, "002", "張三", "15522223333", "前端"));
userList.add(new User(3, "003", "李四", "13355556666", "後端"));
userList.add(new User(4, "004", "王五", "13311112222", "總監"));
userList.add(new User(5, "002", "張三", "13355556666", "設計"));
Set<User> setData = new HashSet<User>();
setData.addAll(userList);
System.out.println("list- size----" + userList.size());
System.out.println("list-----" + userList.toString());
System.out.println("set- size----" + setData.size());
System.out.println("set-----" + setData.toString());
for (User pp : setData) {
System.out.println("p--" + pp.toString());
}
}
}
一般情況下我們重寫equals()方法的時候都要去重寫hashCode()方法,
String類中的equals()方法的原始碼如下, 通過觀察equals()方法的原始碼我們可以看出,該方法去比較兩個物件時,首先先去判斷兩個物件是否具有相同的地址,如果是同一個物件的引用,則直接放回true;如果地址不一樣,則證明不是引用同一個物件,接下來就是挨個去比較兩個字串物件的內容是否一致,完全相等返回true,否則false。
- publicboolean equals(Object anObject) {
-
if (this == anObject) {
- returntrue;
- }
- if (anObject instanceof String) {
- String anotherString = (String)anObject;
- int n = count;
- if (n == anotherString.count) {
- char v1[] = value;
- char v2[] = anotherString.value;
- int i = offset;
- int j = anotherString.offset;
- while (n-- != 0) {
- if (v1[i++] != v2[j++])
- returnfalse;
- }
- returntrue;
- }
- }
- returnfalse;
- }
String類中hashCode()方法的原始碼如下,在Object類中的hashCode()方法是返回物件的32位JVM記憶體地址,也就是說如果我們不去重寫該方法,將會返回該物件的32位JVM記憶體地址。
- publicint hashCode() {
- int h = hash;
- if (h == 0 && count > 0) {
- int off = offset;
- char val[] = value;
- int len = count;
- for (int i = 0; i < len; i++) {
- h = 31*h + val[off++];
- }
- hash = h;
- }
- return h;
- }
摘抄一句,用白話說,通過hashCode判斷物件是否放在同一個桶裡,然後再通過equals方法去判斷這個桶裡的物件是不是相同的,這個比喻是否挺形象,哈哈。
更多可參考:
http://blog.csdn.net/fenglibing/article/details/8905007
相關推薦
Java中List集合去重(二)
關於List中物件去重,如果List中儲存的資料型別是基本資料型別,可直接將list集合轉換成set集合,或採用其他方法,上篇有陳述。本篇說下list集合中的資料型別是一個物件型別的情況,需要在物件的實體類中去重寫equals()方法和hashCode()方法。 在該例
Java中的集合框架-Collection(一)
一,Collection介面 在日常的開發工作中,我們經常使用陣列,但是陣列是有很多的侷限性的,比如:陣列大小固定後不可修改,只能儲存基本型別的值等等。 基於陣列的這些侷限性,Java框架就產生了用於解決此類問題的工具,即集合框架。 Java中有許多的集合框架類,基於這些類的共性特徵,向上高
List集合去重的一些方法(常規遍歷、Set去重、java8 stream去重、重寫equals和hashCode方法)
利用 src false java8 see eat 基本 style ceo 1. 常規元素去重 碰到List去重的問題,除了遍歷去重,我們常常想到利用Set集合不允許重復元素的特點,通過List和Set互轉,來去掉重復元素。 // 遍歷後判斷賦給另一個list集
Java中List集合的遍歷(三種遍歷方式效率的比較)
public static void main(String args[]){ compare(); } public static void compare() { List<String> list = new ArrayList
集合去重 (集合元素為引用型別)--- java 8 新特性 --- 根據元素單屬性、多屬性實現去重
1. 程式碼寫法: (要求 JDK 1.8 或 1.8 以上) package gentle.entity; import lombok.Data; /** * * @author sile
Java List集合 去重的多種方法 (保留順序和不保留順序的)
1.迴圈list中的所有元素然後刪除重複 /** * 迴圈list中的所有元素然後刪除重複 * @param list 待去重的list * @return 去重後的list */ public
python進階指南:list如何去重(去掉list中元素為字典的且字典部分key相同的list元素)
def _remove_duplicate(self, dict_list): seen = set() new_dict_list = [] for dict in dict_list: t_
Java web中常見編碼亂碼問題(二)
catalina 轉換 alt str 檢測 內容 tom 拼搏 image 根據上篇記錄Java web中常見編碼亂碼問題(一), 接著記錄亂碼案例: 案例分析: 2、輸出流寫入內容或者輸入流讀取內容時亂碼(內容中有中文) 原因分析: a、 如果是
Java中List集合的遍歷
java list 集合 遍歷 一、對List的遍歷有三種方式 List<String> list = new ArrayList<String>(); list.add("testone"); list.add(
Java中List集合遍歷的三種方式
asn tex iter for nbsp next next() ray string 首先創建一個List集合: List<String> list = new ArrayList<String>();list.add("name"); list
Java中List集合排序的方法 比較器的使用 根據學生對象數序 語文 英語成績總和進行sort排序
private system.in set swift ringbuf 直觀 turn @override encoding package com.swift; import java.util.ArrayList; import java.util.Collecti
C# List集合去重使用lambda表達式
重復 center font per aci clas select pad -a name age sex Lucy 22 woman Lily 23 woman Tom 24 man Lucy 22 woman Lily 23 woman
List集合去除重複資料 Java中List集合去除重複資料的方法
【轉自】Java中List集合去除重複資料的方法 1. 迴圈list中的所有元素然後刪除重複 public static List removeDuplicate(List list) { for ( int
java集合原始碼解析(二)--AbstractCollection
今天帶來的是java單列頂層介面的第一個輕量級實現:AbstractCollection 我們直接進入正題,先來看看它的宣告: package java.util; //可以從名字上同樣看到 AbstractCollection 是一個抽象類,所以並不能例項化, //這個類只是作
Java8 list根據一個欄位去重(記錄)
list = list.stream().collect( Collectors.collectingAndThen( Collectors.toCollection(() -> new TreeSet&l
java8處理list集合去重分組操作
//分組統計重複String的名稱和數量 List<String> list = new ArrayList<>(); list.add("a"); list.add("b"); list.add("a"); Map<String,Long> map
C# List集合去重使用lambda表示式
name age sex Lucy 22 woman Lily 23 woman Tom 24 man
java中list集合的clear
java中list集合通過clear()方法清空,只會將list中的物件變成垃圾回收清空,但是list物件還是存在。 但是通過list=null後,不僅列表中的物件變成了垃圾,為列表分配的空間也會回收,什麼都不做與賦值NULL一樣,說明直到程式結束也用不上列表
針對list集合去重的幾種方法
list集合去重分對整體物件去重和根據物件中某個欄位去重,以下對這兩種方式的去重進行區別。 1、list集合中針對整體物件去重 這種方法就相對比較死板,必須集合的物件中每個欄位都相同才能去重。 使用
移除陣列中的重複元素-列表去重(Python)
給定一個升序排列的陣列,去掉重複的數,並輸出新的陣列的長度。 例如:陣列 A={1,1,2},你的程式應該輸出 2 即新陣列的長度,新陣列為 {1,2}。 要求:不能新開陣列分配額外的空間,即常數空間限制。 輸入格式 輸入一個整數 n(1≤n≤1000)。 接下來一