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

Java中EnumMap代替序數索引代碼詳解

 更新時間:2018年02月01日 10:00:28   作者:司馬懿字仲達  
這篇文章主要介紹了Java中EnumMap代替序數索引代碼詳解,小編覺得還是挺不錯的,具有一定借鑒價值,需要的朋友可以參考下

本文研究的主要是Java中EnumMap代替序數索引的相關內容,具體介紹如下。

學習筆記《Effective Java 中文版 第2版》

經常會碰到使用Enum的ordinal方法來索引枚舉類型。

public class Herb {
  public enum Type { ANNUAL, PERENNIAL, BIENNIAL };
  private final String name;
  private final Type type;

  Herb(String name, Type type) {
    this.name = name;
    this.type = type;
  }

  @Override public String toString() {
    return name;
  }
}

現在假設有一個香草的數組,表示一座花園中的植物,你想要按照類型(一年生、多年生或者兩年生植物)進行組織之后再將這些植物列出來。如果要這么做的話,需要構建三個集合,每種類型一個,并且遍歷整座花園,將每種香草放到相應的集合中。有些程序員會將這些集合放到一個按照類型的序數進行索引的數組來實現這一點。

//Using ordinal() to index an array - DON'T DO THIS
Herb[] garden = ... ;

//Indexed by Herb.Type.ordinal()
Set<Herb>[] herbsByType = (Set<Herb>[])new Set[Herb.Type.values().length]; 
for(int i=0; i<herbsByType.length; i++) {
  herbsByType[i] = new HashSet<Herb>();
}

for(Herb h : garden) {
  herbsByType[h.type.ordinal()].add(h);
}

//Print the results
for(int i=0; i<herbsByType.length; i++) {
  System.out.printf("%s: %s%n", Herb.Type.values()[i], herbsByType[i]);
}

這種方法的確可行,但是隱藏著許多問題。因為數組不能與泛型兼容。程序需要進行未受檢的轉換,并且不能正確無誤地進行編譯。因為數組不知道它的索引代表著什么,你必須手工標注這些索引的輸出。但是這種方法最嚴重的問題在于,當你訪問一個按照枚舉的序數進行索引的數組時,使用正確的int值就是你的職責了;int不能提供枚舉的類型安全。你如果使用了錯誤的值,程序就會悄然地完成錯誤的工作,或者幸運的話就會拋出ArrayIndexOutOfBoundException異常。

java.util.EnumMap是一種非常快速的Map實現專門用于枚舉的鍵。

//Using an EnumMap to associate data with an enum
Map<Herb.Type, Set<Herb>> herbsByType = new EnumMap<Herb.Type, 
Set<Herb>>(Herb.Type.class);

for(Herb.Type t : Herb.Type.values)
  herbsByType.put(t, new HashSet<Herb>());

for(Herb h : garden)
  herbsByType.get(h.type).add(h);

System.out.println(herbsByType);

這段程序更簡短,更清楚,也更安全,運行速度方面可以與使用序數的程序相媲美。它沒有不安全的轉換;不必手工標注出這些索引的輸出,因為映射鍵知道如何將自身翻譯成可打印的字符串的枚舉;計算數組索引時也不可能出錯。EnumMap在運行速度方面之所以能與通過序數索引的數組相媲美,是因為EnumMap在內部使用了這種數組。但是它對程序員隱藏了這種思想細節(jié),集Map的豐富功能和類型安全與數組的快速于一身。注意EnumMap構造器采用鍵類型的Class對象:這是一個有限制的類型令牌(bounded type token),它提供了運行時的泛型信息。

總結

以上就是本文關于Java中EnumMap代替序數索引代碼詳解的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關文章

  • 詳解java動態(tài)代理模式

    詳解java動態(tài)代理模式

    這篇文章主要為大家詳細介紹了java動態(tài)代理模式,總結一下代理模式,以及jdk,cglib代理模式用法,來理解代理模式,感興趣的小伙伴們可以參考一下
    2016-02-02
  • SpringBoot中JPA更新時部分字段無效

    SpringBoot中JPA更新時部分字段無效

    本文主要介紹了SpringBoot中JPA更新時部分字段無效,在通過注解自動更新時,部分字段在調試時可以找到,卻沒有被自動更新到數據庫中,下面就介紹一下解決方法
    2023-04-04
  • java使用鏈表實現約瑟夫環(huán)

    java使用鏈表實現約瑟夫環(huán)

    這篇文章主要為大家詳細介紹了java使用鏈表實現約瑟夫環(huán),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • bootstrap.yml如何讀取nacos配置中心的配置文件

    bootstrap.yml如何讀取nacos配置中心的配置文件

    這篇文章主要介紹了bootstrap.yml讀取nacos配置中心的配置文件問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-12-12
  • 解讀classpath讀取resources目錄下的文件

    解讀classpath讀取resources目錄下的文件

    這篇文章主要介紹了解讀classpath讀取resources目錄下的文件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 解析Java異步之call future

    解析Java異步之call future

    當調用一個函數的時候,如果這個函數的執(zhí)行過程是很耗時的,就必須要等待,但是有時候并不急著要這個函數返回的結果。因此,可以讓被調者立即返回,讓他在后臺慢慢處理這個請求。對于調用者來說,可以先處理一些其他事情,在真正需要數據的時候再去嘗試獲得需要的數據
    2021-06-06
  • java實現短信通信的完整教程

    java實現短信通信的完整教程

    這篇文章主要為大家詳細介紹了java實現短信通信的完整教程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-05-05
  • Java多線程案例之阻塞隊列詳解

    Java多線程案例之阻塞隊列詳解

    阻塞隊列是一種特殊的隊列.?也遵守?“先進先出”?的原則.阻塞隊列能是一種線程安全的數據結構。本文將通過一些示例為大家詳細講講阻塞隊列的原理與使用,感興趣的小伙伴可以學習一下
    2022-10-10
  • Java?熱更新?Groovy?實踐及踩坑指南(推薦)

    Java?熱更新?Groovy?實踐及踩坑指南(推薦)

    Apache的Groovy是Java平臺上設計的面向對象編程語言,這門動態(tài)語言擁有類似Python、Ruby和Smalltalk中的一些特性,可以作為Java平臺的腳本語言使用,這篇文章主要介紹了Java?熱更新?Groovy?實踐及踩坑指南,需要的朋友可以參考下
    2022-09-09
  • 基于maven中多個子模塊的構建順序

    基于maven中多個子模塊的構建順序

    這篇文章主要介紹了maven中多個子模塊的構建順序,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09

最新評論

五峰| 岑溪市| 双江| 浮梁县| 清水河县| 密山市| 黎川县| 松溪县| 青龙| 同江市| 铜陵市| 安达市| 永康市| 宜都市| 夹江县| 内黄县| 唐海县| 九龙坡区| 镇坪县| 仁布县| 华池县| 彭山县| 吉林省| 宜州市| 石楼县| 尼木县| 文昌市| 山西省| 遂川县| 舒城县| 冕宁县| 渑池县| 和田市| 沈阳市| 青阳县| 巴东县| 拉萨市| 顺平县| 阿城市| 平凉市| 定襄县|