Java EnumSet使用教程

x33g5p2x  于2021-08-20 转载在 Java  
字(3.1k)|赞(0)|评价(0)|浏览(156)

在这篇文章中,我们将讨论java.util包中的EnumSet类。

我们将学到什么?

  1. EnumSet类概述
  2. EnumSetClass方法总结
  3. EnumSetClass实例

1. EnumSet类概述

  • EnumSet是一个专门用于枚举类型的Set实现。枚举集中的所有元素都必须来自一个枚举类型,这个类型在创建枚举集时被明确或隐含地指定。枚举集在内部被表示为位向量。这种表示方法是非常紧凑和有效的。
  • 这个类的空间和时间性能应该足够好,允许它作为一个高质量的、类型安全的替代品来替代传统的基于int的 "位标志"。即使是批量操作(如containsAll和retainAll),如果它们的参数也是一个枚举集,也应该运行得非常快。
  • 由迭代器方法返回的迭代器按照元素的自然顺序(枚举常量的声明顺序)进行遍历。返回的迭代器是弱一致性的:它永远不会抛出ConcurrentModificationException,它可能会也可能不会显示在迭代过程中发生的对集合的任何修改的效果。
  • 空元素是不允许的。试图插入一个空元素将抛出NullPointerException。然而,试图测试一个空元素的存在或移除一个空元素的尝试将正常运行。
  • 像大多数集合实现一样,EnumSet是不同步的。如果多个线程同时访问一个枚举集,并且至少有一个线程修改了该集合,那么它应该是外部同步的。
    比如说。
Set<MyEnum> s = Collections.synchronizedSet(EnumSet.noneOf(MyEnum.class));

这个类是Java Collections Framework的成员。

2. EnumSet类方法总结

  • static <E extends Enum> EnumSet allOf(Class elementType) - 创建一个包含指定元素类型中所有元素的枚举集。
  • EnumSet clone() - 返回这个集合的副本。
  • static <E extends Enum> EnumSet complementOf(EnumSet s) - 创建一个与指定的枚举集具有相同元素类型的枚举集,最初包含所有不包含在指定集合中的该类型的元素。
  • static <E extends Enum> EnumSet copyOf(Collection c) - 创建一个从指定集合初始化的枚举集。
  • static <E extends Enum> EnumSet copyOf(EnumSet s)- 创建一个与指定枚举集具有相同元素类型的枚举集,最初包含相同的元素(如果有)。
  • static <E extends Enum> EnumSet noneOf(Class elementType) - 创建一个具有指定元素类型的空枚举集。
  • static <E extends Enum> EnumSet of(E e)- 创建一个最初包含指定元素的枚举集。
  • static <E extends Enum> EnumSet of(E first, E... rest) - 创建一个最初包含指定元素的枚举集。
  • static <E extends Enum> EnumSet of(E e1, E e2)- 创建一个最初包含指定元素的枚举集。
  • static <E extends Enum> EnumSet of(E e1, E e2, E e3)- 创建一个最初包含指定元素的枚举集。
  • static <E extends Enum> EnumSet of(E e1, E e2, E e3, E e4) - 创建一个最初包含指定元素的枚举集。
  • static <E extends Enum> EnumSet of(E e1, E e2, E e3, E e4, E e5)- 创建一个最初包含指定元素的枚举集。
  • static <E extends Enum> EnumSet range(E from, E to) - 创建一个枚举集,最初包含由两个指定端点定义的范围内的所有元素。

3. EnumSet类的例子

让我们来看看Effective Java书中的一个例子。在这个例子中,我们使用了基本颜色RED、GREEN和BLUE,通过使用EnumSet来创建一个自定义的颜色。正如我所说,EnumSet非常适用于组合效果,无论是文本样式,如Effective Java中描述的BOLD和UNDERLINE,还是组合基本颜色来创建自定义颜色。如果你有MS paint,你甚至可以测试颜色的组合,例如,你可以结合RED和BLUE来创建YELLOW,结合所有三个来创建WHITE,或者结合RED和BLUE来创建PINK。

import java.util.EnumSet;
import java.util.Set;

public class EnumSetExample {

    public static void main(final String[] args) {
    // this will draw line in yellow color

        final EnumSet<Color> yellow = EnumSet.of(Color.RED, Color.GREEN);
        drawLine(yellow);

        // RED + GREEN + BLUE = WHITE
        final EnumSet<Color> white = EnumSet.of(Color.RED, Color.GREEN, Color.BLUE);
        drawLine(white);
  
        // RED + BLUE = PINK
        final EnumSet<Color> pink = EnumSet.of(Color.RED, Color.BLUE);
        drawLine(pink);

    }

  public static void drawLine(final Set<Color> colors) {
      System.out.println("Requested Colors to draw lines : " + colors);
      for (final Color c : colors) {
          System.out.println("drawing line in color : " + c);
      }
  }

 private enum Color {
     RED(255, 0, 0), GREEN(0, 255, 0), BLUE(0, 0, 255);
     private int r;
     private int g;
     private int b;

     private Color(final int r, final int g, final int b) {
         this.r = r;
         this.g = g;
         this.b = b;
    }

    public int getR() {
        return r;
    }

    public int getG() {
        return g;
    }

    public int getB() {
        return b;
    }
  }
}

输出:

Requested Colors to draw lines : [RED, GREEN]
drawing line in color : RED
drawing line in color : GREEN
Requested Colors to draw lines : [RED, GREEN, BLUE]
drawing line in color : RED
drawing line in color : GREEN
drawing line in color : BLUE
Requested Colors to draw lines : [RED, BLUE]
drawing line in color : RED
drawing line in color : BLUE

###参考文献

相关文章

热门文章

更多