1. 程式人生 > >Java中List集合去重(二)

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。

  1. publicboolean equals(Object anObject) {  
  2.     if (this == anObject) {  
  3.         returntrue;  
  4.     }  
  5.     if (anObject instanceof String) {  
  6.         String anotherString = (String)anObject;  
  7.         int n = count;  
  8.         if (n == anotherString.count) {  
  9.             char v1[] = value;  
  10.             char v2[] = anotherString.value;  
  11.             int i = offset;  
  12.             int j = anotherString.offset;  
  13.             while (n-- != 0) {  
  14.                 if (v1[i++] != v2[j++])  
  15.                     returnfalse;  
  16.             }  
  17.             returntrue;  
  18.         }  
  19.     }  
  20.     returnfalse;  
  21. }  

        String類中hashCode()方法的原始碼如下,在Object類中的hashCode()方法是返回物件的32位JVM記憶體地址,也就是說如果我們不去重寫該方法,將會返回該物件的32位JVM記憶體地址。

  1. publicint hashCode() {  
  2.     int h = hash;  
  3.     if (h == 0 && count > 0) {  
  4.         int off = offset;  
  5.         char val[] = value;  
  6.         int len = count;  
  7.         for (int i = 0; i < len; i++) {  
  8.             h = 31*h + val[off++];  
  9.         }  
  10.         hash = h;  
  11.     }  
  12.     return h;  
  13. }  
        這個測試的例子中,當註釋重寫的hashCode()方法時,這時預設返回物件的32JVM中的地址,兩個不同的物件地址顯然是不同的,我們在比較時,雖然通過重寫的equals()方法比較出來userCd和userNm值是相同的,但是預設的hashCode()方法返回的值他們並不是同一個物件,所以我們通常要將hashCode()方法與equals()方法一起重寫,以維護hashCode方法的常規協定,該協定宣告相等物件必須具有相等的雜湊碼。

        摘抄一句,用白話說,通過hashCode判斷物件是否放在同一個桶裡,然後再通過equals方法去判斷這個桶裡的物件是不是相同的,這個比喻是否挺形象,哈哈。

更多可參考:

http://blog.csdn.net/fenglibing/article/details/8905007

相關推薦

JavaList集合

關於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集

JavaList集合的遍歷三種遍歷方式效率的比較

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、 如果是

JavaList集合的遍歷

java list 集合 遍歷 一、對List的遍歷有三種方式 List<String> list = new ArrayList<String>(); list.add("testone"); list.add(

JavaList集合遍歷的三種方式

asn tex iter for nbsp next next() ray string 首先創建一個List集合: List<String> list = new ArrayList<String>();list.add("name"); list

JavaList集合排序的方法 比較器的使用 根據學生對象數序 語文 英語成績總和進行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集合去除重複資料 JavaList集合去除重複資料的方法

【轉自】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

javalist集合的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)。 接下來一