最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡單了解Java位域的一些知識

 更新時間:2019年07月04日 09:50:28   作者:千江月09  
這篇文章主要介紹了簡單了解Java位域的一些知識,這個概念是在 Effective Java中了解到的, 可以通過EnumSet來代替位域這種方式表達(dá),需要的朋友可以參考下

這個概念是在 Effective Java中了解到的, 可以通過EnumSet來代替位域這種方式表達(dá).并不是很常見的概念, 因此記錄下.如果在這之前恰好了解過 bitmap這種數(shù)據(jù)結(jié)構(gòu)就更好了。不了解也沒有關(guān)系。

bitmap 就是用bit的每一位來代表一個特殊的狀態(tài)值,或者說標(biāo)簽屬性等等.舉例來說, 8位的數(shù)值, 用 0000 0001 代表 北, 0000 0010 代表南, 0000 0100 代表西 依次類推.

那么當(dāng)我們拿到一串bit, 如:0100 0000 自然可以去對應(yīng)的映射關(guān)系表中查找到 究竟是屬于哪一種類型, 如果我們想同時傳遞兩個數(shù)值呢?

只需要 0000 0011 這樣就可以表示 北 南 兩個方向了, 當(dāng)然 至多可以表示 8個方向.

我們來試試這種表示方式:

public class Direction {
  public static final short NORTH = 1;
  public static final short SOUTH = 1 << 2;
  public static final short WEST = 1 << 3;
  public static final short EAST = 1 << 4;
  public static final short SOUTH_EAST = 1 << 8;
}

在這里我只是簡略的定義了其中5中.

那么可能會有一個問題, 既然使用 short來表示, 為什么不用 1 2 3 ... 8 來表示數(shù)據(jù)呢? 這樣我們甚至都不需要2 的 8次方, 只需要 3位就能夠表示所有數(shù)據(jù)了.

但是不妨讓我們再來想一想, 在使用 1 ~ 8 的方式中如何同時傳入多種狀態(tài)呢?

在這里是不是必須使用 一個 short[] 去接收數(shù)據(jù)?

那么用位有什么好處呢?

void array(NORTH | SOUTH | SOUTH_EAST)

在方法的調(diào)用上 可以采用這種直觀易懂且計算速度快的方式, 而在傳入值 不難發(fā)現(xiàn) 最終只有一個值:

1000 0011

這一個數(shù)值即表示了包含了相應(yīng)的三種狀態(tài).而這就是 java中 位域的使用方式.那么進(jìn)一步來看, 當(dāng)我們不再滿足 8位 甚至需要更多種狀態(tài)值的時候 可以切換到 int long 甚至于 bitmap. 接收無限位。

但僅僅是位域這種表示 我們僅僅支持 64種以下的狀態(tài)類型, 因為 java種最長的基本類型 也就只有64位了。

那么繼續(xù)來看看這種位域有什么缺陷呢?

使用int 類型 或 long類型, 沒有辦法加入一些自定義的東西, 通常情況下 在這種地方使用枚舉是更好地選擇。

否則的話所有的地方依然要使用 switch判斷的方式, 另外由于 int定義為 static final 時 本身就是編譯時常量,

如果有人依賴他, 將來即使這里的數(shù)值更新了, 比如刪掉兩三個, 即使不重新編譯, 對方的class文件依然不會出錯。 但事實上, 出錯是一種必然。

就上面的例子來說, 我們想要返回所有的String 該怎么辦?必然是 switch case return "南" 類似的方式.

那么切換成枚舉類型呢?

public enum EnumDirection {
  NORTH("north"), EAST("east"), SOUTH("south"), WEST("south");
  private final String name;
  private EnumDirection(String name) {
    this.name = name;
  }
  public String getName() {
    return this.name;
  }
}

枚舉類型的好處,不再贅述。

那與今天的主題, 位域有什么關(guān)系呢?我們知道,位域的優(yōu)點(diǎn) 占用內(nèi)存小, 表示方便, 傳遞值方便, 性能高.EnumSet, 讓我抄一段描述:

這個類實現(xiàn)Set接口,提供了豐富的功能,類型安全性,以及可以從任何其他Set實現(xiàn)中得到的互用性。但是在內(nèi)部具體的實現(xiàn)上,每個EnumSet內(nèi)容都表示為位矢量。如果底層的枚舉類型有64個或者更少的元素——大多數(shù)如此。整個EnumSet就用單個long來表示,因此它的性能比的上位域的性能。批處理,如removeAll和retainAll,都是利用位算法來實現(xiàn)的。就像手工替代位域?qū)崿F(xiàn)得那樣。

是的, 是位運(yùn)算.

就看一段代碼:

public boolean contains(Object e) {
  if (e == null)
    return false;
  Class<?> eClass = e.getClass();
  if (eClass != elementType && eClass.getSuperclass() != elementType)
    return false;
  return (elements & (1L << ((Enum<?>)e).ordinal())) != 0;
}

我們關(guān)注到最后一行, 如上述EnumDirection, WEST 的 ordinal() 即是4, 也就意味著 它值在這里被理解為 1 << 4

而通過 elements 傳入enumSet 的集合, 如:

EnumSet<EnumDirection> enumSet = EnumSet.of(EnumDirection.EAST, EnumDirection.NORTH);

不難獲知 enumSet 的 elements值為 0000 0011 當(dāng)然 這里是 long類型, 我只寫了最后8位, 而

0000 0011 & 0000 1000 必然是等于 0的 因此 contains 返回false.

這是極其高效的方式. 而目的也正在于解決 int型 位域的種種弊端.

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • spring使用xml方式整合Druid數(shù)據(jù)源連接池

    spring使用xml方式整合Druid數(shù)據(jù)源連接池

    傳統(tǒng)的JDBC數(shù)據(jù)庫連接方式,每次連接都需加載Connection到內(nèi)存并驗證,使用后再放回,從而重復(fù)利用數(shù)據(jù)庫連接資源,這不僅降低了系統(tǒng)資源消耗,還避免了頻繁連接導(dǎo)致的服務(wù)器崩潰和內(nèi)存泄漏風(fēng)險,數(shù)據(jù)庫連接池在初始化時創(chuàng)建并保持最小數(shù)量的數(shù)據(jù)庫連接
    2024-10-10
  • SpringAMQP消息隊列(SpringBoot集成RabbitMQ方式)

    SpringAMQP消息隊列(SpringBoot集成RabbitMQ方式)

    這篇文章主要介紹了SpringAMQP消息隊列(SpringBoot集成RabbitMQ方式),具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04
  • java使用jaxb操作xml示例

    java使用jaxb操作xml示例

    JAXB主要用來實現(xiàn)對象和XML之間的序列化和反序列化,關(guān)于JAXB的介紹就不多說了,這里主要總結(jié)下基本使用方法和一些注意事項
    2014-04-04
  • Mybatis Plus LambdaQueryWrapper的具體用法

    Mybatis Plus LambdaQueryWrapper的具體用法

    Mybatis Plus 在其基礎(chǔ)上擴(kuò)展了 LambdaQueryWrapper,LambdaQueryWrapper 提供了更加簡便的查詢語法,同時也避免了SQL注入的風(fēng)險,感興趣的可以了解一下
    2023-11-11
  • Java 在PPT中添加混合圖表過程詳解

    Java 在PPT中添加混合圖表過程詳解

    這篇文章主要介紹了Java 在PPT中添加混合圖表過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-09-09
  • JAVA觀察者模式的的講解及代碼實現(xiàn)

    JAVA觀察者模式的的講解及代碼實現(xiàn)

    這篇文章主要為大家詳細(xì)介紹了JAVA的觀察者模式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-03-03
  • springboot項目中使用docker進(jìn)行遠(yuǎn)程部署的實現(xiàn)

    springboot項目中使用docker進(jìn)行遠(yuǎn)程部署的實現(xiàn)

    本文主要介紹了在Spring Boot項目中使用Docker進(jìn)行遠(yuǎn)程部署,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2025-01-01
  • 詳解Spring Cloud Hystrix斷路器實現(xiàn)容錯和降級

    詳解Spring Cloud Hystrix斷路器實現(xiàn)容錯和降級

    本篇文章主要介紹了詳解Spring Cloud Hystrix斷路器實現(xiàn)容錯和降級,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-05-05
  • Java 讀取指定路徑的文本文件并返回String的方法

    Java 讀取指定路徑的文本文件并返回String的方法

    今天小編就為大家分享一篇Java 讀取指定路徑的文本文件并返回String的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • 詳解Java編程中final,finalize,finally的區(qū)別

    詳解Java編程中final,finalize,finally的區(qū)別

    這篇文章主要介紹了詳解Java編程中final,finalize,finally的區(qū)別,這個在Java面試題中簡直是太常見了...需要的朋友可以參考下
    2015-11-11

最新評論

龙山县| 永城市| 抚宁县| 明星| 华容县| 前郭尔| 崇州市| 鹤庆县| 开化县| 双峰县| 盈江县| 仙桃市| 宝兴县| 南充市| 九台市| 镇宁| 巴青县| 镇沅| 明星| 潼关县| 山阳县| 轮台县| 宜良县| 凤庆县| 那坡县| 长垣县| 景德镇市| 延津县| 甘孜| 鸡东县| 垫江县| 新邵县| 滦南县| 柳江县| 通城县| 临夏县| 日喀则市| 綦江县| 阳高县| 临沧市| 麻阳|