Java中HashSet、LinkedHashSet和TreeSet的區別與相似之處
HashSet、LinkedHashSet和TreeSet是主要用於儲存元素的Set介面類。
HashSet − HashSet是一個容器例項,它以非同步方式儲存僅唯一的元素,以處理涉及集合的高效能操作。集合允許空值,但不遵循插入順序。
LinkedHashSet − LinkedHashSet是一個克隆的資料結構,它同時具有雜湊表和連結串列作為集合介面的功能。LinkedHashSet的有序版本始終在輸入元素上作為雙向連結串列工作。
TreeSet − TreeSet是一個排序的資料結構,它透過使用樹形對映的儲存作為介面工作。集合遵循一般的排序,其中比較器類使用建構函式設定延遲的值。
儘管這些介面類之間存在一些差異,並且也有一些共同點,但我們在這裡試圖討論它們。
輸入
[ ARB, RDD, KOL, DHKA ]
輸出
Insertion Order of objects in HashSet : [ ARB, RDD, KOL, DHKA ] Insertion Order of objects in LinkedHashSet : [ ARB, RDD, DHKA, KOL ] Insertion Order of objects in TreeSet : [ ARB, DHKA, KOL, RDD ]
HashSet、LinkedHashSet和TreeSet之間的相似之處
基於HashSet、LinkedHashSet和TreeSet的偏好和操作方式,它們之間有很多相似之處。
資料集的介面 − HashSet、LinkedHashSet和TreeSet是一些常用的類,它們透過繼承用作介面。
無重複 − 這些集合不允許任何重複的內容,因為它們本質上是唯一的。
框架 − 這些是一些著名的Java集合框架,能夠以獨特的方式提供操作。
HashSet、LinkedHashSet和TreeSet之間的區別
儘管有一些相似之處,但這些集合有很多區別,如下所示:
HashSet |
LinkedHashSet |
TreeSet |
---|---|---|
HashSet使用雜湊表來儲存資料。 |
使用雙向連結串列維護插入順序。 |
我們總是使用自平衡二叉樹,稱為紅黑樹。 |
元素以任意方式排序。 |
以可預測的迭代順序工作。 |
使用自定義比較器排序。 |
它在恆定時間內工作。 |
完成每個步驟後,我們可以比較插入和刪除過程。 |
在特定範圍內,我們可以用O(log n)的時間從首尾檢索資料。 |
在這裡,我們可以說HashSet對於一般的集合操作是最有效和最突出的過程。另一方面,LinkedHashSet總是遵循插入方式,而TreeSet自動地對元素進行排序。
使用的方法
使用插入順序和插入時間方法
演算法
該演算法將向您展示使用一些計時器值實現HashSet、LinkedHashSet和TreeSet結構的系統過程。
步驟1 − 開始程序。
步驟2 − 宣告輸入輸出流。
步驟3 − 匯入內建類和宣告的函式。
步驟4 − 宣告一個公共類。
步驟5 − 設定函式。
步驟6 − 進行插入排序。
步驟7 − 宣告一個數組列表並填充它。
步驟8 − 宣告Set值。
步驟9 − 按照插入方式列印值。
步驟10 − 宣告一個迴圈來迭代過程。
步驟11 − 設定計時器值。
步驟12 − 執行程序並獲取輸出值。
步驟13 − 終止程序。
語法
語法將首先檢查帶有某些整數值的TreeSet。之後,我們將宣告一個map set,以從這些元素中建立一些對,根據免疫力對其進行過濾。
TreeSet < Integer > STTREE = new TreeSet < > () ; STTREE . add ( 4 ) ; STTREE . add ( 5 ) ; STTREE . add ( 6 ) ; STTREE . add ( 8 ) ; STTREE . add ( 4 ) ; TreeMap < Integer , Integer > MAPTREE = new TreeMap < > () ; MAPTREE . put ( 2,5 ) ; MAPTREE . put ( 3,6 ) ; MAPTREE . put ( 4,6 ) ; MAPTREE . put ( 2,3 ) ;
使用插入順序和插入時間方法
插入順序是一種協議,使用者可以透過它使用一定的插入時間將更多元素新增到資料集中。插入時間是元素保持時間消耗記錄的時間間隔。在這種方法中,我們在LinkedHashSet上使用了insertionOrder()函式來以O(1)的時間複雜度執行該過程。
示例
在示例程式碼中,我們透過使用迭代來獲取上述對映之間的差異,執行了各種過程,例如在特定時間段內進行插入和刪除。
import java.util.Arrays; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.TreeSet; public class ARBRDD { private static void insertionOrder (){ LinkedHashSet < String > ARBRDDLINKEDSET = new LinkedHashSet <> (); TreeSet <String> ARBRDDTREESET = new TreeSet <> (); HashSet <String> ARBRDDHASHSET = new HashSet <String> (); for ( String str : Arrays.asList ( "ARB", "RDD", "DHKA", "KOL" ) ) { ARBRDDLINKEDSET . add ( str ) ; ARBRDDTREESET . add ( str ) ; ARBRDDHASHSET . add ( str ) ; } System.out.println ( "Insertion Order " + " of objects in HashSet :" + ARBRDDHASHSET ) ; System.out.println ( " Insertion Order of " + "objects in LinkedHashSet : " + ARBRDDLINKEDSET ) ; System.out.println ( "Insertion Order of" + " objects in TreeSet : " + ARBRDDTREESET ) ; } private static void insertionTime () { HashSet <Integer> numbersHS = new HashSet <> () ; long startTime = System . nanoTime () ; for ( int i = 0; i < 1000; i ++ ) { numbersHS . add ( i ) ; } long endTime = System . nanoTime () ; System.out.println ( "Total time to insert" + " 1000 elements in" + " HashSet in nanoseconds: " + ( endTime - startTime ) ) ; LinkedHashSet <Integer> numbersLLS = new LinkedHashSet <> () ; startTime = System . nanoTime () ; for ( int i = 0; i < 1000; i ++ ) { numbersLLS . add ( i ) ; } endTime = System . nanoTime () ; System.out.println ( "Total time to insert" + " 1000 elements in" + " LinkedHashSet nanoseconds: " + ( endTime - startTime ) ) ; TreeSet <Integer> numbersTS = new TreeSet <> () ; startTime = System . nanoTime () ; for ( int i = 0; i < 1000; i++ ) { numbersTS . add ( i ) ; } endTime = System . nanoTime () ; System.out.println ( "Total time to insert" + " 1000 elements in" + " TreeSet in nanoseconds: " + ( endTime - startTime ) ) ; } private static void deletion () { HashSet <Integer> deletionHS = new HashSet <> () ; for ( int i = 0; i < 1000; i ++ ) { deletionHS . add ( i ) ; } long startingTime = System . nanoTime () ; for ( int i = 0; i < 1000; i ++ ) { deletionHS . remove ( i ) ; } long endedTime = System . nanoTime () ; System.out.println("Total time to Deletion " + "1000 elements in HashSet in nanoseconds : " + Math . abs ( startingTime - endedTime ) ) ; LinkedHashSet <Integer> deletionLLS = new LinkedHashSet <> () ; for ( int i = 0; i < 1000; i ++ ) { deletionLLS . add ( i ) ; } startingTime = System . nanoTime () ; for ( int i = 0; i < 1000; i ++ ) { deletionLLS . remove ( i ) ; } endedTime = System . nanoTime () ; System.out.println ( "Total time to Deletion 1000" + " elements in LinkedHashSet in nanoseconds: " + Math . abs ( startingTime - endedTime ) ) ; TreeSet <Integer> deletionTS = new TreeSet <> () ; for ( int i = 0; i < 1000; i ++ ) { deletionTS . add ( i ) ; } startingTime = System . nanoTime () ; for ( int i = 0; i < 1000; i ++ ) { deletionTS . remove ( i ) ; } endedTime = System . nanoTime () ; System.out.println( "Total time to Deletion 1000" + " elements in TreeSet in nanoseconds: " + Math . abs ( startingTime - endedTime ) ) ; } public static void main ( String args [] ){ insertionOrder () ; insertionTime () ; deletion () ; } }
輸出
Insertion Order of objects in HashSet : [ ARB, RDD, KOL, DHKA ] Insertion Order of objects in LinkedHashSet : [ ARB, RDD, DHKA, KOL ] Insertion Order of objects in TreeSet : [ ARB, DHKA, KOL, RDD ] Total time to insert 1000 elements in HashSet in nanoseconds : 584880 Total time to insert 1000 elements in LinkedHashSet nanoseconds : 343136 Total time to insert 1000 elements in TreeSet in nanoseconds : 1445318 Total time to Deletion 1000 elements in HashSet in nanoseconds : 339148 Total time to Deletion 1000 elements in LinkedHashSet in nanoseconds : 261723 Total time to Deletion 1000 elements in TreeSet in nanoseconds : 877681
結論
因此,在今天的文章中,我們將學習HashSet、LinkedHashSet和TreeSet之間顯著的區別。它們之間也有許多相似之處,因為它們都實現了Set介面。這三種結構不允許重複,並且是非同步的。我們可以使用迭代器克隆它們並調整它們的大小,因為這些資料集是故障優先的。