Java List中數(shù)據(jù)的去重
list中數(shù)據(jù)的去重,通常使用將list轉(zhuǎn)換為set,簡單直接,因?yàn)閟et集合的特點(diǎn)就是沒有重復(fù)的元素。需要考慮一下兩種情況:
1.List集合中的數(shù)據(jù)類型是基本數(shù)據(jù)類型
可以直接將list集合轉(zhuǎn)換成set,就會(huì)自動(dòng)去除重復(fù)的元素。
如下示例:
public class Test {
public static void main(String[] args) {
List list = new ArrayList();
list.add(11);
list.add(12);
list.add(13);
list.add(14);
list.add(15);
list.add(11);
System.out.println(list);
Set set = new HashSet();
List newList = new ArrayList();
set.addAll(list);
newList.addAll(set);
System.out.println(newList);
}
}
2.List集合中存儲(chǔ)的數(shù)據(jù)類型是對(duì)象類型
需要在對(duì)象的實(shí)體類中去重寫equals()方法和hashCode()方法
public class People {
private String name;
private String phoneNumber;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPhoneNumber() {
return phoneNumber;
}
public void setPhoneNumber(String phoneNumber) {
this.phoneNumber = phoneNumber;
}
public People(String name, String phoneNumber) {
super();
this.name = name;
this.phoneNumber = phoneNumber;
}
@Override
public String toString() {
return "People{" +
"name='" + name + ''' +
", phoneNumber='" + phoneNumber + ''' +
'}';
}
@Override
public boolean equals(Object o) {
People p = (People) o;
return name.equals(p.name) && phoneNumber.equals(p.phoneNumber);
}
@Override
public int hashCode() {
String str = name + phoneNumber;
return str.hashCode();
}
}
public static void main(String[] args) {
List<People> listPeople = new ArrayList<People>();
listPeople.add(new People("張三", "11111"));
listPeople.add(new People("張三", "22222"));
listPeople.add(new People("李四", "33333"));
listPeople.add(new People("張三", "22222"));
Set<People> setData = new HashSet<People>();
setData.addAll(listPeople);
System.out.println("list:" + listPeople.toString());
System.out.println("set:" + setData.toString());
}
最后,我們拿出String中的equals()方法和hashCode()方法源碼來加深認(rèn)識(shí):
equals()
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
}
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++])
return false;
}
return true;
}
}
return false;
}
比較兩個(gè)對(duì)象時(shí),首先先去判斷兩個(gè)對(duì)象是否具有相同的地址,如果是同一個(gè)對(duì)象的引用,則直接放回true;如果地址不一樣,則證明不是引用同一個(gè)對(duì)象,接下來就是挨個(gè)去比較兩個(gè)字符串對(duì)象的內(nèi)容是否一致,完全相等返回true,否則false。
hashCode()
public int 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()官方定義:
hashcode方法返回該對(duì)象的哈希碼值。支持該方法是為哈希表提供一些優(yōu)點(diǎn),例如,java.util.Hashtable 提供的哈希表。
hashCode 的常規(guī)協(xié)定是:
在 Java 應(yīng)用程序執(zhí)行期間,在同一對(duì)象上多次調(diào)用 hashCode 方法時(shí),必須一致地返回相同的整數(shù),前提是對(duì)象上 equals 比較中所用的信息沒有被修改。從某一應(yīng)用程序的一次執(zhí)行到同一應(yīng)用程序的另一次執(zhí)行,該整數(shù)無需保持一致。
如果根據(jù) equals(Object) 方法,兩個(gè)對(duì)象是相等的,那么在兩個(gè)對(duì)象中的每個(gè)對(duì)象上調(diào)用 hashCode 方法都必須生成相同的整數(shù)結(jié)果。
以下情況不是必需的:如果根據(jù) equals(java.lang.Object) 方法,兩個(gè)對(duì)象不相等,那么在兩個(gè)對(duì)象中的任一對(duì)象上調(diào)用 hashCode 方法必定會(huì)生成不同的整數(shù)結(jié)果。但是,程序員應(yīng)該知道,為不相等的對(duì)象生成不同整數(shù)結(jié)果可以提高哈希表的性能。
實(shí)際上,由 Object 類定義的 hashCode 方法確實(shí)會(huì)針對(duì)不同的對(duì)象返回不同的整數(shù)。(這一般是通過將該對(duì)象的內(nèi)部地址轉(zhuǎn)換成一個(gè)整數(shù)來實(shí)現(xiàn)的,但是 JavaTM 編程語言不需要這種實(shí)現(xiàn)技巧。)
當(dāng)equals方法被重寫時(shí),通常有必要重寫 hashCode 方法,以維護(hù) hashCode 方法的常規(guī)協(xié)定,該協(xié)定聲明相等對(duì)象必須具有相等的哈希碼。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接
- Java中對(duì)List去重 Stream去重的解決方法
- java list去重操作實(shí)現(xiàn)方式
- 如何實(shí)現(xiàn)java8 list按照元素的某個(gè)字段去重
- java中List對(duì)象列表實(shí)現(xiàn)去重或取出及排序的方法
- Java實(shí)現(xiàn)對(duì)兩個(gè)List快速去重并排序操作示例
- Java中List根據(jù)map的某個(gè)key去重的代碼
- java正則表達(dá)式實(shí)現(xiàn)提取需要的字符并放入數(shù)組【ArrayList數(shù)組去重復(fù)功能】
- Java中List集合對(duì)象去重及按屬性去重的8種方法
- java list去重操作實(shí)現(xiàn)方式
- Java中List集合去除重復(fù)數(shù)據(jù)的方法匯總
相關(guān)文章
java?SpringBoot注解@Async不生效的解決方法
大家好,本篇文章主要講的是java?SpringBoot注解@Async不生效的解決方法,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-01-01
SpringBoot接口或方法進(jìn)行失敗重試的實(shí)現(xiàn)方式
為了防止網(wǎng)絡(luò)抖動(dòng),影響我們核心接口或方法的成功率,通常我們會(huì)對(duì)核心方法進(jìn)行失敗重試,如果我們自己通過for循環(huán)實(shí)現(xiàn),會(huì)使代碼顯得比較臃腫,所以本文給大家介紹了SpringBoot接口或方法進(jìn)行失敗重試的實(shí)現(xiàn)方式,需要的朋友可以參考下2024-07-07
SpringBoot手動(dòng)使用EhCache的方法示例
本篇文章主要介紹了SpringBoot手動(dòng)使用EhCache的方法示例,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02
SpringBoot整合Dubbo框架,實(shí)現(xiàn)RPC服務(wù)遠(yuǎn)程調(diào)用
Dubbo是一款高性能、輕量級(jí)的開源Java RPC框架,它提供了三大核心能力:面向接口的遠(yuǎn)程方法調(diào)用,智能容錯(cuò)和負(fù)載均衡,以及服務(wù)自動(dòng)注冊(cè)和發(fā)現(xiàn)。今天就來看下SpringBoot整合Dubbo框架的步驟2021-06-06
Java數(shù)據(jù)導(dǎo)入功能之讀取Excel文件實(shí)例
這篇文章主要介紹了Java數(shù)據(jù)導(dǎo)入功能之讀取Excel文件實(shí)例,本文給出了jar包的下載地址以及讀取Excel文件的代碼實(shí)例,需要的朋友可以參考下2015-06-06

