Java中EnumSet和TreeSet的區別


在Java中,集合提供了廣泛的選項來儲存和操作資料。兩個流行的集合類,EnumSet和TreeSet,提供了管理元素集的不同方法。雖然它們都用於儲存唯一元素,但它們在實現和用法上存在根本差異。本文旨在深入探討這些差異,以便清楚地理解Java中的EnumSet和TreeSet。

語法

在我們研究它們的對比之前,讓我們看一下建立EnumSet和TreeSet例項的基本語言結構:

EnumSet

EnumSet<EnumType> enumSet = EnumSet.noneOf(EnumType.class);

TreeSet

TreeSet<DataType> treeSet = new TreeSet<>();

語法解釋

EnumSet專門設計用於處理Java中的列舉型別。它使用EnumType類,該類表示要為其建立集合的特定列舉型別。透過呼叫EnumSet上的“noneOf”方法並提供EnumType類,將建立一個空的EnumSet例項。

另一方面,TreeSet是一個通用的集合實現,可以儲存任何型別的物件。在本例中,我們使用泛型語法聲明瞭一個名為“treeSet”的TreeSet物件,允許我們定義集合將包含的特定資料型別。

方法1:EnumSet

EnumSet提供了一種記憶體高效的表示方法,用於表示包含列舉值的集合。它在內部將集合表示為位向量,這使得聯合、交集和補集等操作非常高效。以下是演算法表示:

方法1

  • 為所需的列舉型別建立一個EnumSet例項。

  • 使用“add”方法或在初始化期間傳遞多個列舉常量來向EnumSet新增元素。

  • 使用EnumSet方法執行集合運算,例如聯合、交集或補集。

  • 使用增強型for迴圈或其他迭代技術迭代元素。

  • 執行特定於EnumSet的其他操作,例如檢查集合是否為空或獲取其大小。

示例

import java.util.EnumSet;

enum Days {
   MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY
}

public class EnumSetExample {
   public static void main(String[] args) {
      EnumSet<Days> workingDays = EnumSet.of(Days.MONDAY, Days.TUESDAY, Days.WEDNESDAY, Days.THURSDAY, Days.FRIDAY);
      EnumSet<Days> weekendDays = EnumSet.complementOf(workingDays);
    
      System.out.println("Working days: " + workingDays);
      System.out.println("Weekend days: " + weekendDays);
    
      for (Days day : workingDays) {
         System.out.println("Today is a working day: " + day);
      }
   }
}

輸出

Working days: [MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY]
Weekend days: []
Today is a working day: MONDAY
Today is a working day: TUESDAY
Today is a working day: WEDNESDAY
Today is a working day: THURSDAY
Today is a working day: FRIDAY

方法1程式碼解釋

在此程式碼片段中,我們定義了一個名為“Days”的列舉型別,表示一週中的幾天。我們建立一個名為“workingDays”的EnumSet,並使用“of”方法將其初始化為星期一到星期五。然後,我們透過取“workingDays”集合的補集來獲取“weekendDays”集合。最後,我們迭代“workingDays”集合並使用增強型for迴圈列印每一天。

方法2:TreeSet

顧名思義,TreeSet是使用平衡樹結構實現的。它為基本的新增、刪除和包含等操作提供保證的對數時間複雜度。以下是演算法表示:

方法2

  • 建立一個TreeSet例項,使用泛型語法指定所需的資料型別(例如Integer、String或自定義物件)。

  • 使用“add”方法向TreeSet新增元素。

  • 使用“remove”方法從TreeSet刪除元素。

  • 使用“contains”方法檢查TreeSet中是否存在元素。

  • 使用迭代器或增強型for迴圈迭代元素。

  • 執行TreeSet類提供的其他操作,例如獲取第一個或最後一個元素,或獲取集合的子集。

示例

import java.util.TreeSet;

public class TreeSetExample {
   public static void main(String[] args) {
      TreeSet<Integer> numbers = new TreeSet<>();
    
      numbers.add(5);
      numbers.add(2);
      numbers.add(8);
      numbers.add(1);
      numbers.add(4);
    
      numbers.remove(2);
    
      System.out.println("Numbers: " + numbers);
    
      System.out.println("Contains 4? " + numbers.contains(4));
    
      for (int number : numbers) {
         System.out.println("Number: " + number);
      }
   }
}

輸出

Numbers: [1, 4, 5, 8]
Contains 4? true
Number: 1
Number: 4
Number: 5
Number: 8

方法2程式碼解釋

在這個程式碼片段中,我們建立了一個名為“numbers”的TreeSet,它儲存整數。我們使用“add”方法新增一些數字,並使用“remove”方法刪除數字2。然後,我們使用“contains”方法檢查集合是否包含數字4。最後,我們迭代TreeSet並使用增強型for迴圈列印每個數字。

Java中EnumSet和TreeSet的區別

特性

EnumSet

TreeSet

用途

專門設計用於處理列舉型別

通用的集合實現

實現

內部使用位向量以提高記憶體效率

基於平衡樹結構

元素型別

限於列舉型別

可以儲存任何型別的物件

效能

對於聯合、交集和補集等操作效率很高

對於基本操作保證對數時間複雜度

排序

遵循列舉常量的自然順序

按排序順序維護元素(自然順序或自定義順序)

結論

總之,EnumSet和TreeSet是Java中Set介面的兩種不同實現。EnumSet專門設計用於處理列舉型別,並使用位向量提供高效的操作。另一方面,TreeSet是基於平衡樹結構的通用集合實現,為基本操作提供保證的對數時間複雜度。EnumSet和TreeSet的選擇取決於應用程式的具體要求。透過理解它們的差異和功能,您可以做出明智的決策,併為您的Java專案利用最合適的集合實現。

更新於:2023年7月28日

瀏覽量:103

開啟您的職業生涯

完成課程獲得認證

開始學習
廣告