Java中HashSet、LinkedHashSet和TreeSet區(qū)別詳解
HashSet、LinkedHashSet、TreeSet區(qū)別
如果你需要一個訪問快速的Set,你應該使用HashSet;當你需要一個排序的Set,你應該使用TreeSet;當你需要記錄下插入時的順序時,你應該使用LinedHashSet。
HashSet是采用hash表來實現(xiàn)的。其中的元素沒有按順序排列,add()、remove()以及contains()等方法都是復雜度為O(1)的方法。
TreeSet是采用樹結構實現(xiàn)(紅黑樹算法)。元素是按順序進行排列,但是add()、remove()以及contains()等方法都是復雜度為O(log (n))的方法。
它還提供了一些方法來處理排序的set,如first(), last(), headSet(), tailSet()等等。
LinkedHashSet介于HashSet和TreeSet之間。它也是一個hash表,但是同時維護了一個雙鏈表來記錄插入的順序?;痉椒ǖ膹碗s度為O(1)。
一、HashSet
- 不能保證元素的排列順序,順序有可能發(fā)生變化
- 不是同步的,非線程安全
- 集合元素可以是null,但只能放入一個null
- 當向HashSet結合中存入一個元素時,HashSet會調用該對象的hashCode()方法來得到該對象的hashCode值,然后根據(jù) hashCode值來決定該對象在HashSet中存儲位置。
- 簡單的說,HashSet集合判斷兩個元素相等的標準是兩個對象通過equals方法比較相等,并且兩個對象的hashCode()方法返回值相等
- 注意,如果要把一個對象放入HashSet中,重寫該對象對應類的equals方法,也應該重寫其hashCode()方法。其規(guī)則是如果兩個對象通過equals方法比較返回true時,其hashCode也應該相同。另外,對象中用作
- equals比較標準的屬性,都應該用來計算hashCode的值。
二、LinkedHashSet
nkedHashSet集合同樣是根據(jù)元素的hashCode值來決定元素的存儲位置,但是它同時使用鏈表維護元素的次序。這樣使得元素看起 來像是以插入順序保存的,也就是說,當遍歷該集合時候,LinkedHashSet將會以元素的添加順序訪問集合的元素。
- LinkedHashSet中不能有相同元素,可以有一個Null元素,元素嚴格按照放入的順序排列。
- LinkedHashSet如何保證有序和唯一性?
- 底層數(shù)據(jù)結構由哈希表和鏈表組成。
- 鏈表保證了元素的有序即存儲和取出一致,哈希表保證了元素的唯一性。
- 添加、刪除操作時間復雜度都是O(1)。
- 非線程安全
三、TreeSet
TreeSet是SortedSet接口的唯一實現(xiàn)類,TreeSet可以確保集合元素處于排序狀態(tài)。
TreeSet支持兩種排序方式,自然排序 和定制排序,其中自然排序為默認的排序方式。
向TreeSet中加入的應該是同一個類的對象。
TreeSet判斷兩個對象不相等的方式是兩個對象通過equals方法返回false,或者通過CompareTo方法比較沒有返回0
自然排序
自然排序使用要排序元素的CompareTo(Object obj)方法來比較元素之間大小關系,然后將元素按照升序排列。
定制排序
自然排序是根據(jù)集合元素的大小,以升序排列,如果要定制排序,應該使用Comparator接口,實現(xiàn) int compare(T o1,T o2)方法
1.TreeSet是中不能有相同元素,不可以有Null元素,根據(jù)元素的自然順序進行排序。
2.TreeSet如何保證元素的排序和唯一性?
底層的數(shù)據(jù)結構是紅黑樹(一種自平衡二叉查找樹)
3.添加、刪除操作時間復雜度都是O(log(n))
4.非線程安全
TreeSet排序如下
public class Person3 {
private int age;
private String name;
public Person3(String name, int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"age=" + age +
", name='" + name + '\'' +
'}';
}
public static void main(String[] args) {
Set<Person3> set = new TreeSet<>(new Comparator<Person3>() {
@Override
public int compare(Person3 o1, Person3 o2) {
if(o1 == null || o2 == null){
return 0;
}
return o1.age - o2.age;
}
});
set.add(new Person3("zzh",18));
set.add(new Person3("jj",17));
set.add(new Person3("qq",19));
set.add(new Person3(null,19));
//[Person{age=17, name='jj'}, Person{age=18, name='zzh'}, Person{age=19, name='qq'}]
System.out.println(set);
}四.總結
通過以上特點可以分析出,三者都保證了元素的唯一性,如果無排序要求可以選用HashSet;
如果想取出元素的順序和放入元素的順序相同,那么可以選用LinkedHashSet。如果想插入、刪除立即排序或者按照一定規(guī)則排序可以選用TreeSet。
到此這篇關于Java中HashSet、LinkedHashSet和TreeSet區(qū)別詳解的文章就介紹到這了,更多相關HashSet、LinkedHashSet和TreeSet內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
- Java LinkedHashSet集合的底層原理和TreeSet集合
- Java中HashMap和HashSet的高效使用技巧分享
- Java中的Set接口實現(xiàn)類HashSet和LinkedHashSet詳解
- Java集合ArrayList、LinkedList、HashMap、HashSet最大容量
- java的==運算符和equals操作詳解
- Java中==和equals()的區(qū)別總結
- java兩個integer數(shù)據(jù)判斷相等用==還是equals
- 詳解Java中==和equals()的區(qū)別
- 淺談java字符串比較到底應該用==還是equals
- java中的HashSet與 == 和 equals的區(qū)別示例解析
相關文章
關于springboot忽略接口,參數(shù)注解的使用ApiIgnore
這篇文章主要介紹了關于springboot忽略接口,參數(shù)注解的使用ApiIgnore,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
idea install 時提示jdk的某個jar包的包不存在的問題
這篇文章主要介紹了idea install 時提示jdk的某個jar包的包不存在的問題,本文給大家分享解決方法,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-09-09
Java中Scanner的使用及nextLine和nextInt等混用報錯解決方案
Scanner類用于從控制臺輸入數(shù)據(jù),常用方法包括next()、nextLine()、nextInt()、nextDouble()和nextBoolean(),案例測試和常見錯誤情況分析表明,nextDouble等方法不會跳過空格和回車,而nextLine會讀取整行并跳到下一行2026-03-03
Springboot項目對數(shù)據(jù)庫用戶名密碼實現(xiàn)加密過程解析
這篇文章主要介紹了Springboot項目對數(shù)據(jù)庫用戶名密碼實現(xiàn)加密過程解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-06-06
Spring Boot 中 MyBatis 與 Spring 
這篇文章主要介紹了Spring Boot 中 MyBatis 與 Spring Data JPA 的優(yōu)缺點對比,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧2025-05-05
spring中@Bean和@Component的區(qū)別及說明
文章主要介紹了@Bean和@Component兩個注解在Spring框架中的定義、作用范圍、創(chuàng)建方式、掃描和識別機制以及使用場景和建議2024-12-12

