Java中EnumMap和EnumSet的區別


在Java中,EnumMap和EnumSet是兩個專門的類,它們提供了處理列舉型別的高效方法。EnumMap和EnumSet都是Java集合框架的一部分,併為處理列舉型別的集合提供了特殊的功能。在這篇文章中,我們將探討EnumMap和EnumSet之間的區別、它們的語法以及它們如何在不同的場景中使用。

語法

在深入細節之前,讓我們首先了解Java中EnumMap和EnumSet的基本語法:

EnumMap語法

EnumMap<EnumClass, ValueType> map = new EnumMap<>(EnumClass.class);

EnumSet語法

EnumSet<EnumClass> set = EnumSet.<EnumClass>of(EnumValue1, EnumValue2, ...);

語法解釋

EnumMap - EnumMap類使用兩個型別進行引數化。第一個型別是列舉類本身,指定對映中鍵的型別。第二個型別是與每個鍵關聯的值型別。

EnumSet - EnumSet類使用列舉類進行引數化,並表示一組列舉常量。“of”方法用於建立一個EnumSet,其中一個或多個列舉值作為引數指定。

方法1:EnumMap

Java中的EnumMap類專門用於儲存列舉常量作為鍵以及相應的值。它實現為一個值陣列,由列舉常量的序號值索引。這種實現為諸如get和put之類的基本操作提供了高效和恆定的時間效能。

方法1的演算法

  • 透過指定列舉類來建立一個EnumMap例項。

  • 使用put()方法將鍵值對新增到EnumMap中。

  • 使用get()方法從EnumMap中檢索值。

  • 根據需要執行其他操作,例如size()、containsKey()等。

示例

import java.util.EnumMap;

public class EnumMapExample {
   enum Day { MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY }

   public static void main(String[] args) {
      EnumMap<Day, String> tasks = new EnumMap<>(Day.class);

      tasks.put(Day.MONDAY, "Meeting");
      tasks.put(Day.TUESDAY, "Presentation");
      tasks.put(Day.WEDNESDAY, "Code review");
      
      System.out.println("Task for Tuesday: " + tasks.get(Day.TUESDAY));
      System.out.println("Number of tasks: " + tasks.size());
   }
}

輸出

Task for Tuesday: Presentation
Number of tasks: 3

方法1中程式碼的解釋

在給定的程式碼片段中,我們定義了一個名為“Day”的列舉型別,表示一週中的幾天。然後,我們透過指定Day類建立一個名為“tasks”的EnumMap例項。我們使用put()方法將鍵值對新增到EnumMap中,將每一天與一個任務關聯起來。最後,我們使用get()方法從EnumMap中檢索一個值,並使用size()方法顯示任務的數量。

方法2:EnumSet

另一方面,EnumSet旨在表示一組列舉常量。它在內部使用位向量來高效地儲存元素。EnumSet為包含檢查、聯合、交集等操作提供了緊湊且高度最佳化的實現。

方法2的演算法

  • 使用“of”方法並指定列舉值來建立一個EnumSet例項。

  • 對EnumSet執行新增、刪除、包含等操作。

  • 根據需要應用集合操作,如union()、intersection()和complement()。

示例

import java.util.EnumSet;

public class EnumSetExample {
   enum Color { RED, GREEN, BLUE, YELLOW }

   public static void main(String[] args) {
      EnumSet<Color> primaryColors = EnumSet.of(Color.RED, Color.GREEN, Color.BLUE);
      EnumSet<Color> secondaryColors = EnumSet.of(Color.GREEN, Color.BLUE, Color.YELLOW);

      System.out.println("Primary colors: " + primaryColors);
      System.out.println("Secondary colors: " + secondaryColors);

      EnumSet<Color> allColors = EnumSet.allOf(Color.class);
      EnumSet<Color> commonColors = EnumSet.copyOf(primaryColors);
      commonColors.retainAll(secondaryColors);

      System.out.println("All colors: " + allColors);
      System.out.println("Common colors: " + commonColors);
   }
}

輸出

Primary colors: [RED, GREEN, BLUE]
Secondary colors: [GREEN, BLUE, YELLOW]
All colors: [RED, GREEN, BLUE, YELLOW]
Common colors: [GREEN, BLUE]

方法2中程式碼的解釋

在這個程式碼示例中,我們定義了一個名為“Color”的列舉型別,表示不同的顏色。我們使用“of”方法並指定列舉值建立了兩個EnumSet例項,“primaryColors”和“secondaryColors”。然後,我們對EnumSet執行各種操作,例如列印其內容,建立一個包含所有顏色的EnumSet,以及查詢兩個集合之間的共有顏色。

Java中EnumMap和EnumSet的區別

EnumMap

EnumSet

表示列舉常量和值之間的對映。

表示一組列舉常量。

對於將值與列舉常量關聯起來非常高效。

對於處理列舉值集合非常高效。

實現Map介面。

實現Set介面。

內部實現為一個值陣列,由列舉常量的序號值索引。

內部使用位向量進行高效儲存。

為get和put等基本操作提供恆定時間效能。

為包含檢查、聯合、交集等集合操作提供最佳化的效能。

結論

總之,EnumMap和EnumSet是Java中專門的類,它們提供了處理列舉型別的高效方法。EnumMap提供列舉常量和值之間的對映,而EnumSet表示一組列舉常量。當需要將特定值與每個列舉常量關聯時,EnumMap是理想的選擇;當需要處理列舉值集合時,EnumSet非常有用。瞭解這些類的區別和特性,可以充分利用其優勢,從而改進您的Java應用程式。

更新於:2023年7月28日

365 次瀏覽

開啟您的職業生涯

透過完成課程獲得認證

開始學習
廣告