中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Java中EnumSet代替位域的示例分析

發布時間:2021-08-25 10:21:12 來源:億速云 閱讀:221 作者:小新 欄目:編程語言

這篇文章給大家分享的是有關Java中EnumSet代替位域的示例分析的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

具體介紹如下。

位域表示法允許利用位操作,有效地執行先 union(聯合)和 intersection(交集)這樣的集合操作。但是位域有著int枚舉常亮的所有缺點,甚至更多。當位域一數字形式打印時,翻譯位域比翻譯簡單的int枚舉常量要困難得多。甚至,要遍歷位域表示的所有元素都沒有很容易的方法。

//Bit field enumeration constant - OBSOLETE
public class Test {
  public static final byte STYLE_BOLD     = 1<<0; // 1
  public static final byte STYLE_ITALIC    = 1<<1; // 2
  public static final byte STYLE_UNDERLINE   = 1<<2; // 4
  public static final byte STYLE_STRIKETHROUGH = 1<<3; // 6

  //Parameter is bitwise OR of zero or more STYLE_ constants
  public void applyStyles(int styles) { ... }
}

java.util 包提供了EnumSet類來有效地表示從單個枚舉類型中提取的多個值的多個集合。這個類實現Set接口,提供了豐富的功能,類型安全性,以及可以從任何其他Set實現中得到的互用性。但是在內部具體的實現上,每個EnumSet內容都表示為位矢量。如果底層的枚舉類型有64個或者更少的元素——大多數如此。整個EnumSet就用單個long來表示,因此它的性能比的上位域的性能。批處理,如removeAll和retainAll,都是利用位算法來實現的。就像手工替代位域實現得那樣。但是可以避免手工操作時容易出現的錯誤以及不太雅觀的代碼,因為EnumSet替你完成了這項艱巨的工作。`

//EnumSet - a modern replacement for bit fields
public class Text {
  public enum Style { BOLD, ITALIC, UNDERLINE, STRIKETHROUGH };

  //Any Set could be passed in, but EnumSet is clearly best
  public void applyStyles(Set<Style> styles) { 
    System.out.println(styles);
  }

  public void test() {
    applyStyles(EnumSet.of(Style.BOLD, Style.ITALIC));
  }
}

執行 test() ,輸出 [BOLD, ITALIC]

EnumSet 類集位域的簡潔和性能優勢及枚舉類型的所有優點于一身,所以我們沒有理由再使用位域表示法。除非是組成通信協議字段。

但實際上EnumSet也有一個缺點——它無法創建不可變的EnumSet,但我們可以用Collections.unmodifiableSet將EnumSet封裝起來,但是簡潔性和性能都會受到影響。

public void test() {
  EnumSet<Style> styles = EnumSet.of(Style.BOLD, Style.ITALIC);
  Set<Style> unmodifiableStyle = Collections.unmodifiableSet(styles);
  unmodifiableStyle.add(Style.UNDERLINE);
}

這樣如果往 unmodifiableSet 中添加元素就會報 java.lang.UnsupportedOperationException

感謝各位的閱讀!關于“Java中EnumSet代替位域的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

新宁县| 清水县| 伊川县| 广南县| 楚雄市| 中江县| 临安市| 昔阳县| 游戏| 信宜市| 密山市| 科技| 绥宁县| 黄陵县| 会昌县| 林甸县| 乐清市| 新乡市| 许昌市| 三亚市| 怀集县| 玉林市| 镇雄县| 米林县| 新津县| 庆安县| 霸州市| 清苑县| 元江| 桂林市| 南平市| 闵行区| 巴林右旗| 汉川市| 黄浦区| 南通市| 昌吉市| 湾仔区| 清徐县| 息烽县| 军事|