Estructura de datos - clase EnumSet

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.

Supongo que te gusta

Origin www.cnblogs.com/yuanjiangnan/p/12642391.html
Recomendado
Clasificación