Java LinkedHashSet集合的底層原理和TreeSet集合
Collection集合體系:
LinkedHashSet:有序、不重復(fù)、無索引。
看一下之前的代碼:
package cn.chang.d4_collection_set; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.Set; import java.util.TreeSet; /** * 目標(biāo):整體了解下Set集合的特點(diǎn) */ public class SetTest1 { public static void main(String[] args) { // 1. 創(chuàng)建一個(gè)Set集合的對(duì)象 // 無序、不重復(fù)、無索引 //Set<Integer> set = new HashSet<Integer>(); // 多態(tài) HashSet是一個(gè)實(shí)現(xiàn)類 經(jīng)典代碼 Set<Integer> set = new LinkedHashSet<>(); // 有序 不重復(fù) 無索引 //Set<Integer> set = new TreeSet<>(); // 排序升序 不重復(fù) 無索引 set.add(666); set.add(555); set.add(555); // 只顯示一個(gè)555 set.add(888); set.add(777); System.out.println(set); // 不支持索引操作數(shù)據(jù) // 無序一次 } }
運(yùn)行結(jié)果:
可見:LinkedHashSet是無序、不重復(fù)和無索引的。
LinkedHashSet底層原理:
依然是基于哈希表(數(shù)組、鏈表和紅黑樹)實(shí)現(xiàn)的。
但是,它的每個(gè)元素都額外的多了一個(gè)雙鏈表的機(jī)制記錄它前后元素的位置。
通過雙鏈表去找數(shù)據(jù),所以就是有序的。
缺點(diǎn):每個(gè)節(jié)點(diǎn)更占內(nèi)存。
TreeSet:
特點(diǎn):不重復(fù)、無索引、可排序(默認(rèn)升序排序、按照元素的大小、由小到大排序)。
底層是基于紅黑樹實(shí)現(xiàn)的排序。
package cn.chang.d4_collection_set; import java.util.HashSet; import java.util.Set; import java.util.TreeSet; /** * 目標(biāo): 掌握TreeSet集合的使用 */ public class SetTest4 { public static void main(String[] args) { Set<Integer> set = new TreeSet<>(); set.add(6); set.add(5); set.add(5); set.add(7); System.out.println(set); } }
運(yùn)行結(jié)果:
左根右,中序遍歷。
注意:
對(duì)于數(shù)值類型:Integer、Double,默認(rèn)是按照數(shù)值本身的大小進(jìn)行升序 排序。
對(duì)于字符串類型,默認(rèn)按照首字符的編號(hào)升序排列。
對(duì)于自定義類型,如Student對(duì)象,TreeSet默認(rèn)是無法直接排序的。
會(huì)有如下報(bào)錯(cuò)。
自定義排序規(guī)則:
TreeSet集合存儲(chǔ)自定義類型的對(duì)象時(shí),必須指定排序規(guī)則,支持如下兩種方式來指定比較規(guī)則:
方式一:
讓自定義類(如學(xué)生類)實(shí)現(xiàn)Comparable接口,重寫里面的compareTo方法來指定比較規(guī)則。
方式二:
通過調(diào)用TreeSet集合的有參構(gòu)造器,可以設(shè)置Comparator對(duì)象(比較器對(duì)象,用于指定比較規(guī)則)。
方式一:
代碼:
package cn.chang.d4_collection_set; import java.util.HashSet; import java.util.Set; import java.util.TreeSet; /** * 目標(biāo): 掌握TreeSet集合的使用 */ public class SetTest4 { public static void main(String[] args) { Set<Student> students = new TreeSet<>(); students.add(new Student("蜘蛛精", 23, 169.7)); students.add(new Student("紫霞", 22, 169.8)); students.add(new Student("至尊寶", 26, 165.5)); students.add(new Student("牛魔王", 22, 183.5)); System.out.println(students); } }
我們可以看到牛魔王沒有了。如果大小規(guī)則的相等,就重復(fù)了,牛魔王就不存了。
方式二:
package cn.chang.d4_collection_set; import java.util.Comparator; import java.util.HashSet; import java.util.Set; import java.util.TreeSet; /** * 目標(biāo): 掌握TreeSet集合的使用 */ public class SetTest4 { public static void main(String[] args) { Set<Student> students = new TreeSet<>(new Comparator<Student>() { @Override public int compare(Student s1, Student s2) { // 需要按照身高升序排序 return Double.compare(s1.getHeight(), s2.getHeight()); } }); students.add(new Student("蜘蛛精", 23, 169.7)); students.add(new Student("紫霞", 22, 169.8)); students.add(new Student("至尊寶", 26, 165.5)); students.add(new Student("牛魔王", 22, 183.5)); System.out.println(students); } }
運(yùn)行結(jié)果:
現(xiàn)在我們有兩臺(tái)比較方案,優(yōu)先按就近原則采用方法二。
代碼的簡(jiǎn)化:
package cn.chang.d4_collection_set; import java.util.Comparator; import java.util.HashSet; import java.util.Set; import java.util.TreeSet; /** * 目標(biāo): 掌握TreeSet集合的使用 */ public class SetTest4 { public static void main(String[] args) { // Set<Student> students = new TreeSet<>(new Comparator<Student>() { // @Override // public int compare(Student s1, Student s2) { // // 需要按照身高升序排序 // return Double.compare(s1.getHeight(), s2.getHeight()); // } // }); Set<Student> students = new TreeSet<>((o1, o2) -> Double.compare(o1.getHeight(), o2.getHeight())); students.add(new Student("蜘蛛精", 23, 169.7)); students.add(new Student("紫霞", 22, 169.8)); students.add(new Student("至尊寶", 26, 165.5)); students.add(new Student("牛魔王", 22, 183.5)); System.out.println(students); } }
在compare中顛倒下位置,就可以實(shí)現(xiàn)降序排列。
到此這篇關(guān)于Java LinkedHashSet集合的底層原理和TreeSet集合的文章就介紹到這了,更多相關(guān)Java LinkedHashSet和TreeSet集合內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- Java中HashMap和HashSet的高效使用技巧分享
- Java中的Set接口實(shí)現(xiàn)類HashSet和LinkedHashSet詳解
- Java集合ArrayList、LinkedList、HashMap、HashSet最大容量
- Java中HashSet、LinkedHashSet和TreeSet區(qū)別詳解
- java的==運(yùn)算符和equals操作詳解
- Java中==和equals()的區(qū)別總結(jié)
- java兩個(gè)integer數(shù)據(jù)判斷相等用==還是equals
- 詳解Java中==和equals()的區(qū)別
- 淺談java字符串比較到底應(yīng)該用==還是equals
- java中的HashSet與 == 和 equals的區(qū)別示例解析
相關(guān)文章
SpringBoot優(yōu)雅捕捉異常的兩種方法小結(jié)
SpringBoot框架對(duì)異常的處理提供了幾種很強(qiáng)大的方法,我們可以通過@ControllerAdvice和@ExceptionHandler注解實(shí)現(xiàn)全局異常的處理,下面就來介紹一下這兩種方法的實(shí)現(xiàn),感興趣的可以了解一下2024-08-08詳解SpringBoot初始教程之Tomcat、Https配置以及Jetty優(yōu)化
本篇文章主要介紹了詳解SpringBoot初始教程之Tomcat、Https配置以及Jetty優(yōu)化,具有一定的參考價(jià)值,有興趣的可以了解一下2017-09-09Java的Spring框架中實(shí)現(xiàn)發(fā)送郵件功能的核心代碼示例
這篇文章主要介紹了Java的Spring框架中實(shí)現(xiàn)發(fā)送郵件功能的核心代碼示例,包括發(fā)送帶附件的郵件功能的實(shí)現(xiàn),需要的朋友可以參考下2016-03-03Java編程實(shí)現(xiàn)NBA賽事接口調(diào)用實(shí)例代碼
這篇文章主要介紹了Java編程實(shí)現(xiàn)NBA賽事接口調(diào)用實(shí)例代碼,具有一定參考價(jià)值,需要的朋友可以了解下。2017-11-11流讀取導(dǎo)致StringBuilder.toString()亂碼的問題及解決
這篇文章主要介紹了流讀取導(dǎo)致StringBuilder.toString()亂碼的問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11Java?Dubbo服務(wù)調(diào)用擴(kuò)展點(diǎn)Filter使用教程
Dubbo是阿里巴巴公司開源的一個(gè)高性能優(yōu)秀的服務(wù)框架,使得應(yīng)用可通過高性能的RPC實(shí)現(xiàn)服務(wù)的輸出和輸入功能,可以和Spring框架無縫集成2022-12-12springboot中json對(duì)象中對(duì)Long類型和String類型相互轉(zhuǎn)換
與前端聯(lián)調(diào)接口時(shí),后端一些字段設(shè)計(jì)為L(zhǎng)ong類型,這樣就有可能導(dǎo)致前端缺失精度,這時(shí)候我們就需要將Long類型返回給前端時(shí)做數(shù)據(jù)類型轉(zhuǎn)換,本文主要介紹了springboot中json對(duì)象中對(duì)Long類型和String類型相互轉(zhuǎn)換,感興趣的可以了解一下2023-11-11Java中Scanner的常用方法總結(jié)(一次學(xué)懂)
這篇文章主要給大家介紹了關(guān)于Java中Scanner常用方法的相關(guān)資料,Java中的Scanner是一個(gè)用于讀取用戶輸入的類,它可以讀取各種類型的數(shù)據(jù),包括整數(shù)、浮點(diǎn)數(shù)、字符串等等,需要的朋友可以參考下2023-11-11