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介面。這三種結構不允許重複,並且是非同步的。我們可以使用迭代器克隆它們並調整它們的大小,因為這些資料集是故障優先的。

更新於:2023年11月2日

251 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告