解讀Java中Set真的是無序的嗎
Java Set是無序的嗎
我們經(jīng)常聽說List是有序且可重復(fù)的,Set是無序且不重復(fù)的。
這是一個誤區(qū),這里所說的順序有兩個概念
- 一是按照添加的順序排列
- 二是按,照自然順序a-z排列
Set并不是無序的傳統(tǒng)所說的Set無序指的是HashSet,它不能保證元素的添加順序,更不能保證自然順序,而Set的其他實現(xiàn)類是可以實現(xiàn)這兩種順序的。
- LinkedHashset : 保證元素添加的自然順序
- TreeSet : 保證元素的自然順序
通過下面一段代碼來理解上述問題
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.TreeSet;
public class Prectice {
public static void main(String[] args) {
Set<String> set = new HashSet<>();
set.add("String1");
set.add("String4");
set.add("String3");
set.add("String2");
set.add("String5");
set.forEach(e-> System.out.print(e+" "));
System.out.println();
//LinkedHashSet會保證元素的添加順序
Set<String> set2 = new LinkedHashSet<>();
set2.add("String1");
set2.add("String5");
set2.add("String3");
set2.add("String4");
set2.add("String2");
set2.forEach(e-> System.out.print(e+" "));
System.out.println();
//TreeSet保證元素自然順序
Set<String> set3 = new TreeSet<>();
set3.add("String1");
set3.add("String5");
set3.add("String4");
set3.add("String2");
set3.add("String3");
set3.forEach(e-> System.out.print(e+" "));
}
}輸出結(jié)果:
String5 String4 String3 String2 String1 HashSet元素亂序
String1 String5 String3 String4 String2 LinkedHashSet保證元素添加順序String1 String2 String3 String4 String5 TreeSet元素按自然順序排序

java中set集合:有序set集合,集合中的對象存儲注意事項
1、LinkedHashSet(有序)
通過鏈表的形式保證有序;
2、TreeSet(有序)
可以使用比較器:Comparable(內(nèi)部)與Comparator(外部),通過Collections.sort()進(jìn)行排序;
內(nèi)部比較器-對應(yīng)類上面實現(xiàn)comparable的接口,重寫compare的方法;
例如:
Collections.sort(set);
外部比較器--對應(yīng)類上面,編寫內(nèi)部靜態(tài)類-比較器,實現(xiàn)對應(yīng)的comparator接口;
例如:
Collections.sort(set, new AscAgeComparator());
3、set集合中保存對象的時候
去重,要重寫對象的hashcode()和equals()方法,原始set的數(shù)據(jù)結(jié)構(gòu),在取數(shù)的時候,
先取hashcode,如果有多個hashcode相等的值,進(jìn)一步比較equals的函數(shù)值,取出對應(yīng)節(jié)點的數(shù)據(jù);
參與計算hashcode的屬性值,不要變動,變動會造成hashcode的變化,造成保存數(shù)據(jù)不可被重新指向,產(chǎn)生垃圾數(shù)據(jù),甚至OOM;
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java高效實現(xiàn)PDF與OFD的相互轉(zhuǎn)換的示例代碼
在數(shù)字化辦公日益普及的今天,文檔格式的標(biāo)準(zhǔn)化與跨平臺兼容性成為企業(yè)和開發(fā)者面臨的重要挑戰(zhàn),OFD作為國家標(biāo)準(zhǔn),在政務(wù)、金融等領(lǐng)域具有不可替代的地位,而PDF則以其廣泛的兼容性成為日常交流的首選本文將深入探討如何高效地實現(xiàn)PDF與OFD的相互轉(zhuǎn)換2025-10-10
Spring Boot 2.4配置特定環(huán)境時spring: profiles提示被棄用的原
這篇文章主要介紹了Spring Boot 2.4配置特定環(huán)境時spring: profiles提示被棄用的原因,本文給大家分享詳細(xì)解決方案,需要的朋友可以參考下2023-04-04
Springboot Thymeleaf數(shù)字對象使用方法
這篇文章主要介紹了Springboot Thymeleaf數(shù)字對象使用方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2007-09-09

