<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                <!-- Using EnumSet Instead of Flags --> ## 使用 EnumSet 替代 Flags Set 是一種集合,只能向其中添加不重復的對象。當然,enum 也要求其成員都是唯一的,所以 enum 看起來也具有集合的行為。不過,由于不能從 enum 中刪除或添加元素,所以它只能算是不太有用的集合。Java SE5 引入 EnumSet,是為了通過 enum 創建一種替代品,以替代傳統的基于 int 的“位標志”。這種標志可以用來表示某種“開/關”信息,不過,使用這種標志,我們最終操作的只是一些 bit,而不是這些 bit 想要表達的概念,因此很容易寫出令人難以理解的代碼。 EnumSet 的設計充分考慮到了速度因素,因為它必須與非常高效的 bit 標志相競爭(其操作與 HashSet 相比,非常地快),就其內部而言,它(可能)就是將一個 long 值作為比特向量,所以 EnumSet 非常快速高效。使用 EnumSet 的優點是,它在說明一個二進制位是否存在時,具有更好的表達能力,并且無需擔心性能。 EnumSet 中的元素必須來自一個 enum。下面的 enum 表示在一座大樓中,警報傳感器的安放位置: ```java // enums/AlarmPoints.java package enums; public enum AlarmPoints { STAIR1, STAIR2, LOBBY, OFFICE1, OFFICE2, OFFICE3, OFFICE4, BATHROOM, UTILITY, KITCHEN } ``` 然后,我們用 EnumSet 來跟蹤報警器的狀態: ```java // enums/EnumSets.java // Operations on EnumSets // {java enums.EnumSets} package enums; import java.util.*; import static enums.AlarmPoints.*; public class EnumSets { public static void main(String[] args) { EnumSet<AlarmPoints> points = EnumSet.noneOf(AlarmPoints.class); // Empty points.add(BATHROOM); System.out.println(points); points.addAll( EnumSet.of(STAIR1, STAIR2, KITCHEN)); System.out.println(points); points = EnumSet.allOf(AlarmPoints.class); points.removeAll( EnumSet.of(STAIR1, STAIR2, KITCHEN)); System.out.println(points); points.removeAll( EnumSet.range(OFFICE1, OFFICE4)); System.out.println(points); points = EnumSet.complementOf(points); System.out.println(points); } } ``` 輸出為: ```java [BATHROOM] [STAIR1, STAIR2, BATHROOM, KITCHEN] [LOBBY, OFFICE1, OFFICE2, OFFICE3, OFFICE4, BATHROOM, UTILITY] [LOBBY, BATHROOM, UTILITY] [STAIR1, STAIR2, OFFICE1, OFFICE2, OFFICE3, OFFICE4, KITCHEN] ``` 使用 static import 可以簡化 enum 常量的使用。EnumSet 的方法的名字都相當直觀,你可以查閱 JDK 文檔找到其完整詳細的描述。如果仔細研究了 EnumSet 的文檔,你還會發現 of() 方法被重載了很多次,不但為可變數量參數進行了重載,而且為接收 2 至 5 個顯式的參數的情況都進行了重載。這也從側面表現了 EnumSet 對性能的關注。因為,其實只使用單獨的 of() 方法解決可變參數已經可以解決整個問題了,但是對比顯式的參數,會有一點性能損失。采用現在這種設計,當你只使用 2 到 5 個參數調用 of() 方法時,你可以調用對應的重載過的方法(速度稍快一點),而當你使用一個參數或多過 5 個參數時,你調用的將是使用可變參數的 of() 方法。注意,如果你只使用一個參數,編譯器并不會構造可變參數的數組,所以與調用只有一個參數的方法相比,也就不會有額外的性能損耗。 EnumSet 的基礎是 long,一個 long 值有 64 位,而一個 enum 實例只需一位 bit 表示其是否存在。 也就是說,在不超過一個 long 的表達能力的情況下,你的 EnumSet 可以應用于最多不超過 64 個元素的 enum。如果 enum 超過了 64 個元素會發生什么呢? ```java // enums/BigEnumSet.java import java.util.*; public class BigEnumSet { enum Big { A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22, A23, A24, A25, A26, A27, A28, A29, A30, A31, A32, A33, A34, A35, A36, A37, A38, A39, A40, A41, A42, A43, A44, A45, A46, A47, A48, A49, A50, A51, A52, A53, A54, A55, A56, A57, A58, A59, A60, A61, A62, A63, A64, A65, A66, A67, A68, A69, A70, A71, A72, A73, A74, A75 } public static void main(String[] args) { EnumSet<Big> bigEnumSet = EnumSet.allOf(Big.class); System.out.println(bigEnumSet); } } ``` 輸出為: ```java [A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14, A15, A16, A17, A18, A19, A20, A21, A22, A23, A24, A25, A26, A27, A28, A29, A30, A31, A32, A33, A34, A35, A36, A37, A38, A39, A40, A41, A42, A43, A44, A45, A46, A47, A48, A49, A50, A51, A52, A53, A54, A55, A56, A57, A58, A59, A60, A61, A62, A63, A64, A65, A66, A67, A68, A69, A70, A71, A72, A73, A74, A75] ``` 顯然,EnumSet 可以應用于多過 64 個元素的 enum,所以我猜測,Enum 會在必要的時候增加一個 long。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看