解讀Java中Set真的是無(wú)序的嗎
Java Set是無(wú)序的嗎
我們經(jīng)常聽(tīng)說(shuō)List是有序且可重復(fù)的,Set是無(wú)序且不重復(fù)的。
這是一個(gè)誤區(qū),這里所說(shuō)的順序有兩個(gè)概念
- 一是按照添加的順序排列
- 二是按,照自然順序a-z排列
Set并不是無(wú)序的傳統(tǒng)所說(shuō)的Set無(wú)序指的是HashSet,它不能保證元素的添加順序,更不能保證自然順序,而Set的其他實(shí)現(xiàn)類是可以實(shí)現(xiàn)這兩種順序的。
- LinkedHashset : 保證元素添加的自然順序
- TreeSet : 保證元素的自然順序
通過(guò)下面一段代碼來(lái)理解上述問(wèn)題
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會(huì)保證元素的添加順序 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集合,集合中的對(duì)象存儲(chǔ)注意事項(xiàng)
1、LinkedHashSet(有序)
通過(guò)鏈表的形式保證有序;
2、TreeSet(有序)
可以使用比較器:Comparable(內(nèi)部)與Comparator(外部),通過(guò)Collections.sort()進(jìn)行排序;
內(nèi)部比較器-對(duì)應(yīng)類上面實(shí)現(xiàn)comparable的接口,重寫(xiě)compare的方法;
例如:
Collections.sort(set);
外部比較器--對(duì)應(yīng)類上面,編寫(xiě)內(nèi)部靜態(tài)類-比較器,實(shí)現(xiàn)對(duì)應(yīng)的comparator接口;
例如:
Collections.sort(set, new AscAgeComparator());
3、set集合中保存對(duì)象的時(shí)候
去重,要重寫(xiě)對(duì)象的hashcode()和equals()方法,原始set的數(shù)據(jù)結(jié)構(gòu),在取數(shù)的時(shí)候,
先取hashcode,如果有多個(gè)hashcode相等的值,進(jìn)一步比較equals的函數(shù)值,取出對(duì)應(yīng)節(jié)點(diǎn)的數(shù)據(jù);
參與計(jì)算hashcode的屬性值,不要變動(dòng),變動(dòng)會(huì)造成hashcode的變化,造成保存數(shù)據(jù)不可被重新指向,產(chǎn)生垃圾數(shù)據(jù),甚至OOM;
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解讀file.exists(),file.isFile()和file.isDirectory()的區(qū)別
本文介紹了Java中的File類的三個(gè)方法:file.exists()、file.isFile()和file.isDirectory(),并詳細(xì)解釋了它們的區(qū)別和使用場(chǎng)景2025-02-02Spring聲明式事務(wù)@Transactional注解實(shí)現(xiàn)元數(shù)據(jù)驅(qū)動(dòng)的事務(wù)管理
這篇文章主要為大家介紹了Spring聲明式事務(wù)@Transactional注解實(shí)現(xiàn)元數(shù)據(jù)驅(qū)動(dòng)的事務(wù)管理示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-10-10Spring中的攔截器HandlerInterceptor詳細(xì)解析
這篇文章主要介紹了Spring中的攔截器HandlerInterceptor詳細(xì)解析,HandlerInterceptor 是 Spring 框架提供的一個(gè)攔截器接口,用于在請(qǐng)求處理過(guò)程中攔截和處理請(qǐng)求,需要的朋友可以參考下2024-01-01使用Java在線生成pdf文檔的代碼實(shí)現(xiàn)
在實(shí)際的業(yè)務(wù)開(kāi)發(fā)的時(shí)候,研發(fā)人員往往會(huì)碰到很多這樣的一些場(chǎng)景,需要提供相關(guān)的電子憑證信息給用戶,熟悉這塊業(yè)務(wù)的童鞋,一定特別清楚,目前最常用的解決方案通過(guò)一些技術(shù)手段生成對(duì)應(yīng)的PDF文件,下面小編給大家詳細(xì)說(shuō)說(shuō)2025-04-04JAVA 并發(fā)容器的一些易出錯(cuò)點(diǎn)你知道嗎
今天給大家?guī)?lái)的文章是Java并發(fā)編程的相關(guān)知識(shí),文中對(duì)java同步容器與并發(fā)容器做了非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-09-09JAVA實(shí)現(xiàn)心跳檢測(cè)(長(zhǎng)連接)
本文主要介紹了JAVA實(shí)現(xiàn)心跳檢測(cè)(長(zhǎng)連接),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03SpringBoot集成WebServlet出現(xiàn)自定義servlet請(qǐng)求失敗的問(wèn)題解決方案
SpringBoot中以Bean方式注冊(cè)Servlet時(shí)遇到的問(wèn)題,通過(guò)了解DispatcherServlet的原理,發(fā)現(xiàn)默認(rèn)路徑?jīng)_突是主要原因,本文介紹SpringBoot集成WebServlet出現(xiàn)自定義servlet請(qǐng)求失敗的問(wèn)題解決方案,感興趣的朋友一起看看吧2025-03-03