breve introducción
Los objetos con una clase de enumeración si HashSet para poner en el espacio desperdiciado demasiado, porque el HashSet interna o HashMap usando la forma de hash para han sido identificados antes de ejecutar la orden una clase de enumeración, y no van a ser particularmente enumeración muchos siguen a utilizar HashSet más daño que bien, JDK proporciona EnumSet está dedicado al servicio de los tipos enumerados, y otro conjunto EnumSet no es el mismo lugar, se ordena y no se permite insertar nula
clase EnumSet
public abstract class EnumSet<E extends Enum<E>> extends AbstractSet<E>
implements Cloneable, java.io.Serializable
EnumSet valor debe ser valores enumerados, y EnumSet es una clase abstracta, la clase de implementación es EnumMap
propiedad EnumSet
// 保存的数据类型
final Class<E> elementType;
// 保存数据的数组
final Enum<?>[] universe;
// 空枚举
private static Enum<?>[] ZERO_LENGTH_ENUM_ARRAY = new Enum<?>[0];
EnumSet Constructor
EnumSet(Class<E>elementType, Enum<?>[] universe) {
this.elementType = elementType;
this.universe = universe;
}
, Sólo para ser usados subclase hereda el constructor no es pública
enfoque basado EnumSet
// 生成一个空的EnumSet,并指定其数据类型
public static <E extends Enum<E>> EnumSet<E> noneOf(Class<E> elementType) {
Enum<?>[] universe = getUniverse(elementType);
if (universe == null)
throw new ClassCastException(elementType + " not an enum");
//
if (universe.length <= 64)
return new RegularEnumSet<>(elementType, universe);
else
return new JumboEnumSet<>(elementType, universe);
}
EnumSet tiene dos subclases: RegularEnumSet, JumboEnumSet, si el número de elemento de la enumeración es mayor que 64, entonces usted realmente está creando clase de implementación JumboEnumSet, de lo contrario, es la clase de implementación RegularEnumSet
// 枚举类转EnumSet
public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType) {
EnumSet<E> result = noneOf(elementType);
result.addAll();
return result;
}
// 初始集合包括枚举值中指定范围的元素
public static <E extends Enum<E>> EnumSet<E> range(E from, E to) {
if (from.compareTo(to) > 0)
throw new IllegalArgumentException(from + " > " + to);
EnumSet<E> result = noneOf(from.getDeclaringClass());
result.addRange(from, to);
return result;
}
Método de EnumSet
public static <E extends Enum<E>> EnumSet<E> of(E e) {
EnumSet<E> result = noneOf(e.getDeclaringClass());
result.add(e);
return result;
}
public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2) {
EnumSet<E> result = noneOf(e1.getDeclaringClass());
result.add(e1);
result.add(e2);
return result;
}
public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3) {
EnumSet<E> result = noneOf(e1.getDeclaringClass());
result.add(e1);
result.add(e2);
result.add(e3);
return result;
}
public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4) {
EnumSet<E> result = noneOf(e1.getDeclaringClass());
result.add(e1);
result.add(e2);
result.add(e3);
result.add(e4);
return result;
}
public static <E extends Enum<E>> EnumSet<E> of(E e1, E e2, E e3, E e4,
E e5)
{
EnumSet<E> result = noneOf(e1.getDeclaringClass());
result.add(e1);
result.add(e2);
result.add(e3);
result.add(e4);
result.add(e5);
return result;
}
public static <E extends Enum<E>> EnumSet<E> of(E first, E... rest) {
EnumSet<E> result = noneOf(first.getDeclaringClass());
result.add(first);
for (E e : rest)
result.add(e);
return result;
}
EnumSet Hay muchas formas de métodos sobrecargados, se acepta el último parámetro variable, otros métodos sobrecargados parece ser superflua, la razón por la que hay otros métodos sobrecargados debido a la cantidad variable de baja eficiencia operativa de los parámetros.