文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

java中EnumSet抽象类的示例分析

2023-05-30 19:09

关注

这篇文章主要为大家展示了“java中EnumSet抽象类的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“java中EnumSet抽象类的示例分析”这篇文章吧。

EnumSet

EnumSet是Java枚举类型的泛型容器,Java既然有了SortedSet、TreeSet、HashSet等容器,为何还要多一个EnumSet<T>呢?答案肯定是EnumSet有一定的特性,举个例子,EnumSet的速度很快。其他特性就不一一列举了,毕竟本文的内容不是介绍EnumSet的特性。

专门为枚举类设计的集合类,所有元素必须是枚举类型

EnumSet的集合元素是有序的,内部以位向量的形成存储,因此占用内存小,效率高

不允许加入null元素

源码

package java.util;import sun.misc.SharedSecrets;public abstract class EnumSet<E extends Enum<E>> extends AbstractSet<E>  implements Cloneable, java.io.Serializable{    final Class<E> elementType;    final Enum[] universe;  private static Enum[] ZERO_LENGTH_ENUM_ARRAY = new Enum[0];  EnumSet(Class<E>elementType, Enum[] universe) {    this.elementType = elementType;    this.universe  = universe;  }    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);  }    public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType) {    EnumSet<E> result = noneOf(elementType);    result.addAll();    return result;  }    abstract void addAll();    public static <E extends Enum<E>> EnumSet<E> copyOf(EnumSet<E> s) {    return s.clone();  }    public static <E extends Enum<E>> EnumSet<E> copyOf(Collection<E> c) {    if (c instanceof EnumSet) {      return ((EnumSet<E>)c).clone();    } else {      if (c.isEmpty())        throw new IllegalArgumentException("Collection is empty");      Iterator<E> i = c.iterator();      E first = i.next();      EnumSet<E> result = EnumSet.of(first);      while (i.hasNext())        result.add(i.next());      return result;    }  }    public static <E extends Enum<E>> EnumSet<E> complementOf(EnumSet<E> s) {    EnumSet<E> result = copyOf(s);    result.complement();    return result;  }    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;  }    @SafeVarargs  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;  }    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;  }    abstract void addRange(E from, E to);    public EnumSet<E> clone() {    try {      return (EnumSet<E>) super.clone();    } catch(CloneNotSupportedException e) {      throw new AssertionError(e);    }  }    abstract void complement();    final void typeCheck(E e) {    Class eClass = e.getClass();    if (eClass != elementType && eClass.getSuperclass() != elementType)      throw new ClassCastException(eClass + " != " + elementType);  }    private static <E extends Enum<E>> E[] getUniverse(Class<E> elementType) {    return SharedSecrets.getJavaLangAccess()                    .getEnumConstantsShared(elementType);  }    private static class SerializationProxy <E extends Enum<E>>    implements java.io.Serializable  {        private final Class<E> elementType;        private final Enum[] elements;    SerializationProxy(EnumSet<E> set) {      elementType = set.elementType;      elements = set.toArray(ZERO_LENGTH_ENUM_ARRAY);    }    private Object readResolve() {      EnumSet<E> result = EnumSet.noneOf(elementType);      for (Enum e : elements)        result.add((E)e);      return result;    }    private static final long serialVersionUID = 362491234563181265L;  }  Object writeReplace() {    return new SerializationProxy<>(this);  }  // readObject method for the serialization proxy pattern  // See Effective Java, Second Ed., Item 78.  private void readObject(java.io.ObjectInputStream stream)    throws java.io.InvalidObjectException {    throw new java.io.InvalidObjectException("Proxy required");  }}

以上是“java中EnumSet抽象类的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     807人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     351人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     314人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     433人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     221人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯