国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 閱讀EnumSet抽象類源碼

閱讀EnumSet抽象類源碼

2021-02-26 12:48氵冫丶 Java教程

這篇文章主要介紹了閱讀EnumSet抽象類源碼,具有一定參考價值,需要的朋友可以了解下。

EnumSet

EnumSet是Java枚舉類型的泛型容器,Java既然有了SortedSet、TreeSet、HashSet等容器,為何還要多一個EnumSet<T>呢?答案肯定是EnumSet有一定的特性,舉個例子,EnumSet的速度很快。其他特性就不一一列舉了,畢竟本文的內容不是介紹EnumSet的特性。

專門為枚舉類設計的集合類,所有元素必須是枚舉類型

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

不允許加入null元素

源碼

java" id="highlighter_400602">
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
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;
  }
 
  /**
   * 創造一個空的 enum set 并制定其元素類型
   * @param elementType the class object of the element type for this enum
   *   set
   * @throws NullPointerException if <tt>elementType</tt> is null
   */
  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);
  }
 
  /**
   * 創建一個包含所有在指定元素類型的元素的枚舉set
   *
   * @param elementType the class object of the element type for this enum
   *   set
   * @throws NullPointerException if <tt>elementType</tt> is null
   */
  public static <E extends Enum<E>> EnumSet<E> allOf(Class<E> elementType) {
    EnumSet<E> result = noneOf(elementType);
    result.addAll();
    return result;
  }
 
  /**
   * Adds all of the elements from the appropriate enum type to this enum
   * set, which is empty prior to the call.
   */
  abstract void addAll();
 
  /**
   * 創建一個枚舉設置相同的元素類型與指定枚舉set
   *
   * @param s the enum set from which to initialize this enum set
   * @throws NullPointerException if <tt>s</tt> is null
   */
  public static <E extends Enum<E>> EnumSet<E> copyOf(EnumSet<E> s) {
    return s.clone();
  }
 
  /**
   * 創建一個枚舉集從指定集合初始化,最初包含相同的元素
   * @param c the collection from which to initialize this enum set
   * @throws IllegalArgumentException if <tt>c</tt> is not an
   *   <tt>EnumSet</tt> instance and contains no elements
   * @throws NullPointerException if <tt>c</tt> is null
   */
  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;
    }
  }
 
  /**
   * 創建一個枚舉集合,其元素與 s 相同
   * @param s the enum set from whose complement to initialize this enum set
   * @throws NullPointerException if <tt>s</tt> is null
   */
  public static <E extends Enum<E>> EnumSet<E> complementOf(EnumSet<E> s) {
    EnumSet<E> result = copyOf(s);
    result.complement();
    return result;
  }
 
  /**
   * 1 個元素枚舉集合
   *
   * @param e the element that this set is to contain initially
   * @throws NullPointerException if <tt>e</tt> is null
   * @return an enum set initially containing the specified element
   */
  public static <E extends Enum<E>> EnumSet<E> of(E e) {
    EnumSet<E> result = noneOf(e.getDeclaringClass());
    result.add(e);
    return result;
  }
 
  /**
   * 2 個元素枚舉集合
   *
   * @param e1 an element that this set is to contain initially
   * @param e2 another element that this set is to contain initially
   * @throws NullPointerException if any parameters are null
   * @return an enum set initially containing the specified elements
   */
  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;
  }
 
  /**
   * 3 個元素枚舉集合
   *
   * @param e1 an element that this set is to contain initially
   * @param e2 another element that this set is to contain initially
   * @param e3 another element that this set is to contain initially
   * @throws NullPointerException if any parameters are null
   * @return an enum set initially containing the specified elements
   */
  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;
  }
 
  /**
   * 4 個元素枚舉集合
   * @param e1 an element that this set is to contain initially
   * @param e2 another element that this set is to contain initially
   * @param e3 another element that this set is to contain initially
   * @param e4 another element that this set is to contain initially
   * @throws NullPointerException if any parameters are null
   * @return an enum set initially containing the specified elements
   */
  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;
  }
 
  /**
   * 5 個元素枚舉集合
   *
   * @param e1 an element that this set is to contain initially
   * @param e2 another element that this set is to contain initially
   * @param e3 another element that this set is to contain initially
   * @param e4 another element that this set is to contain initially
   * @param e5 another element that this set is to contain initially
   * @throws NullPointerException if any parameters are null
   * @return an enum set initially containing the specified elements
   */
  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;
  }
 
  /**
   * n 個元素枚舉集合
   *
   * @param first an element that the set is to contain initially
   * @param rest the remaining elements the set is to contain initially
   * @throws NullPointerException if any of the specified elements are null,
   *   or if <tt>rest</tt> is null
   * @return an enum set initially containing the specified elements
   */
  @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;
  }
 
  /**
   * 區間內元素的 枚舉集合
   *
   * @param from the first element in the range
   * @param to the last element in the range
   * @throws NullPointerException if {@code from} or {@code to} are null
   * @throws IllegalArgumentException if {@code from.compareTo(to) > 0}
   * @return an enum set initially containing all of the elements in the
   *     range defined by the two specified endpoints
   */
  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;
  }
 
  /**
   * Adds the specified range to this enum set, which is empty prior
   * to the call.
   */
  abstract void addRange(E from, E to);
 
  /**
   * Returns a copy of this set.
   *
   * @return a copy of this set
   */
  public EnumSet<E> clone() {
    try {
      return (EnumSet<E>) super.clone();
    } catch(CloneNotSupportedException e) {
      throw new AssertionError(e);
    }
  }
 
  /**
   * Complements the contents of this enum set.
   */
  abstract void complement();
 
  /**
   * Throws an exception if e is not of the correct type for this enum set.
   */
  final void typeCheck(E e) {
    Class eClass = e.getClass();
    if (eClass != elementType && eClass.getSuperclass() != elementType)
      throw new ClassCastException(eClass + " != " + elementType);
  }
 
  /**
   * Returns all of the values comprising E.
   * The result is uncloned, cached, and shared by all callers.
   */
  private static <E extends Enum<E>> E[] getUniverse(Class<E> elementType) {
    return SharedSecrets.getJavaLangAccess()
                    .getEnumConstantsShared(elementType);
  }
 
  /**
   * This class is used to serialize all EnumSet instances, regardless of
   * implementation type. It captures their "logical contents" and they
   * are reconstructed using public static factories. This is necessary
   * to ensure that the existence of a particular implementation type is
   * an implementation detail.
   *
   * @serial include
   */
  private static class SerializationProxy <E extends Enum<E>>
    implements java.io.Serializable
  {
    /**
     * The element type of this enum set.
     *
     * @serial
     */
    private final Class<E> elementType;
 
    /**
     * The elements contained in this enum set.
     *
     * @serial
     */
    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");
  }
}

總結

以上就是本文關于閱讀EnumSet抽象類源碼的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

原文鏈接:http://blog.csdn.net/qunxingvip/article/details/51925112

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 在线观看成人小视频 | 成人av免费观看 | 欧美日韩一区免费 | 欧美激情第1页 | 亚洲国产精品久久久久久久久久久 | av7777 | 美女爽到呻吟久久久久 | 亚洲免费观看视频 | 日韩欧美一级精品久久 | 成人黄色片网站 | 在线观看的av | 亚洲综合一区在线观看 | 亚洲精品99 | 黄色在线观看视频 | 久久综合久久久 | 黄色一级毛片免费看 | 一区二区免费在线观看 | 久久久精品播放 | 欧日韩在线视频 | 国产精国产精品 | 国产一区二区三区视频在线观看 | 伊人精品影院 | 亚洲成人一区在线观看 | 亚洲成人日韩在线 | 日韩有码一区二区三区 | 亚洲精品一区二区三区精华液 | 日韩一二三区视频 | 亚洲视频一区二区三区在线观看 | 九一午夜精品av | 国产精品免费久久久久久久久久中文 | 久久91| 91精品国产一区二区三区香蕉 | 久久久久国产精品www | 午夜在线视频 | 亚洲精品国产一区 | 四季久久免费一区二区三区四区 | 视频一区在线观看 | 欧美大片免费高清观看 | 精品国产乱码久久久久久影片 | 国产精品久久久久久久久 | 国产精品久久久久久久久久久久久久 |