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

Java Map接口及其實現(xiàn)類原理解析

 更新時間:2020年03月18日 14:17:55   作者:JustinNeil  
這篇文章主要介紹了Java Map接口及其實現(xiàn)類原理解析,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

Map接口

Map提供了一種映射關(guān)系,其中的元素是以鍵值對(key-value)的形式存儲的,能夠?qū)崿F(xiàn)根據(jù)key快速查找value;

Map中的鍵值對以Entry類型的對象實例形式存在;
建(key值)不可重復(fù),value值可以重復(fù),一個value值可以和很多key值形成對應(yīng)關(guān)系,每個建最多只能映射到一個值。

Map支持泛型,形式如:Map<K,V>

Map中使用put(K key,V value)方法添加

Map接口中定義的常用方法

具體使用在實現(xiàn)類中討論

int size();//獲取Map集合大小(即元素數(shù)量)
boolean isEmpty();//判斷是否為空
boolean containsKey(Object key);//判斷是否包含某個鍵
boolean containsValue(Object value);//判斷是否包含某個值
V get(Object key);//獲取某個鍵對應(yīng)的值
V put(K key, V value);//添加鍵值對(K,V)
V remove(Object key);//移除某個鍵對應(yīng)的鍵值對
void putAll(Map<? extends K, ? extends V> m);//添加另一個Map集合
void clear();//清空所有鍵值對
Set<K> keySet();//獲取鍵的集合
Collection<V> values();//獲取值的集合
Set<Map.Entry<K, V>> entrySet();//獲取鍵值對實體的集合
interface Entry<K,V>//Map中的內(nèi)部接口

HashMap

基于哈希表的 Map 接口的實現(xiàn)。此實現(xiàn)提供所有可選的映射操作,并允許使用 null 值和 null 鍵。(除了非同步和允許使用 null 之外,HashMap 類與 Hashtable 大致相同。)除實現(xiàn)了Map接口外還實現(xiàn)了Cloneable,Serializable,繼承了AbstractMap抽象類

此類不保證映射的順序,特別是它不保證該順序恒久不變。

特點:

  • 鍵無序,唯一,類似于Set集合
  • 值有序,可重復(fù),類似于List
  • 底層數(shù)據(jù)結(jié)構(gòu)是哈希表,保證鍵唯一

允許鍵為null,值為null

//   HashMap<String, Student> hm = new HashMap<String, Student>();
//   hm.put("2018050401", new Student("2018050401", "張三", 18, 80.0));
//   hm.put("2018050402", new Student("2018050402", "李四", 18, 80.0));
//   hm.put("2018050403", new Student("2018050403", "李四", 18, 80.0));
//   hm.put("2018050404", new Student("2018050404", "王五", 18, 80.0));
//   hm.put("2018050404", new Student("2018050404", "王五", 18, 80.0));
//   
//   // 方式一: 通過鍵找值
//   Set<String> keys = hm.keySet();
//   for (String key : keys) {
//     Student s = hm.get(key);
//     System.out.println(key + "|" + s.getId() + "|" + s.getName() + "|" + s.getAge() + "|" + s.getScore());
//   }

    HashMap<Student, String> hm = new HashMap<Student, String>();
    hm.put(new Student("2018050401", "張三", 18, 80.0),"2018050401");
    hm.put(new Student("2018050402", "李四", 18, 80.0),"2018050402");
    hm.put(new Student("2018050403", "李四", 18, 80.0), "2018050403");
    hm.put(new Student("2018050404", "王五", 18, 80.0), "2018050404");
    hm.put(new Student("2018050404", "王五", 18, 80.0), "2018050404");
    
    // 方式二: 通過鍵值對對象找鍵找值
    Set<Entry<Student, String>> keyValues = hm.entrySet();
    for (Entry<Student, String> keyValue : keyValues) {
      Student s = keyValue.getKey();
      String value = keyValue.getValue();
      System.out.println(s.getId() + "|" + s.getName() + "|" + s.getAge() + "|" + s.getScore() + "=" + value);
    }

LinkedHashMap

Map 接口的哈希表和鏈表實現(xiàn),具有可預(yù)知的迭代順序

特點:

  • 鍵有序,唯一,
  • 值有序,可重復(fù),類似于List

底層數(shù)據(jù)結(jié)構(gòu)是哈希表和鏈表,哈希表保證鍵唯一,鏈表保證鍵有序

    LinkedHashMap<Integer, String> lhm = new LinkedHashMap<Integer, String>();
    lhm.put(01, "張三1");
    lhm.put(02, "張三2");
    lhm.put(03, "張三3");
    lhm.put(04, "張三4");
    lhm.put(05, "張三5");
    
    Set<Integer> keys = lhm.keySet();
    for (Integer key : keys) {
      System.out.println(key + "|" + lhm.get(key));
    }

TreeMap

基于紅黑樹(Red-Black tree)的 NavigableMap 實現(xiàn)。該映射根據(jù)其鍵的自然順序進行排序,或者根據(jù)創(chuàng)建映射時提供的 Comparator 進行排序,

具體取決于使用的構(gòu)造方法。

特點:

  • 鍵可排序,唯一,
  • 值有序,可重復(fù),類似于List
  • 底層數(shù)據(jù)結(jié)構(gòu)是自平衡的二叉樹,可排序

排序方式類似于TreeSet,分為自然排序和比較器排序,具體取決于使用的構(gòu)造方法

    TreeMap<Integer, String> tm = new TreeMap<Integer, String>();
    tm.put(24, "Hello1");
    tm.put(14, "Hello2");
    tm.put(34, "Hello3");
    tm.put(124, "Hello4");
    tm.put(24, "Hello5");
    tm.put(24, "Hello6");
    tm.put(24, "Hello7");
    tm.put(244, "Hello8");
    tm.put(624, "Hello9");
    tm.put(24, "Hello10");
    Set<Integer> keys = tm.keySet();
    for (Integer key : keys) {
      String value = tm.get(key);
      System.out.println(key + "|" + value);
    }

HashTable

此類實現(xiàn)一個哈希表,該哈希表將鍵映射到相應(yīng)的值。任何非 null 對象都可以用作鍵或值

特點:

  • 不允許null鍵和null值
  • 線程安全,效率低

HashMap和Hashtable的區(qū)別:

  • HashMap是不安全的不同步的效率高的 允許null鍵和null值
  • Hashtable是安全的同步的效率低的 不允許null鍵和null值

底層都是哈希表結(jié)構(gòu)

Hashtable<String, String> hashtable = new Hashtable<String, String>();
    hashtable.put("劉備", "孫尚香");
    hashtable.put("孫策", "大喬");
    hashtable.put("周瑜", "小喬");
    hashtable.put("呂布", "貂蟬");
    System.out.println(hashtable);
    Enumeration<String> keys = hashtable.keys();
    while (keys.hasMoreElements()) {
      String key = keys.nextElement();
      String value = hashtable.get(key);
      System.out.println(key + "|" + value);
    }

WeakHashMap

以弱鍵 實現(xiàn)的基于哈希表的 Map。在 WeakHashMap 中,當某個鍵不再正常使用時,將自動移除其條目。更精確地說,對于一個給定的鍵,其映射的存在并不阻止垃圾回收器對該鍵的丟棄,這就使該鍵成為可終止的,被終止,然后被回收。
丟棄某個鍵時,其條目從映射中有效地移除,因此,該類的行為與其他的 Map 實現(xiàn)有所不同。

    WeakHashMap<String,String> whm = new WeakHashMap<>();
    whm.put(new String("hello1"), "world1");
    whm.put(new String("hello2"), "world2");
    whm.put(new String("hello3"), "world3");
    whm.put("hello4", "world3");
    System.out.println(whm);
    System.gc();
    System.runFinalization();
    System.out.println(whm);

鍵是枚舉類型

    EnumMap<Direction, String> em = new EnumMap<>(Direction.class);
    em.put(Direction.UP, "向上移動");
    em.put(Direction.DOWN, "向下移動");
    em.put(Direction.LEFT, "向左移動");
    em.put(Direction.RIGHT, "向右移動");
    
    Set<Direction> keys = em.keySet();
    for (Direction key : keys) {
      String value = em.get(key);
      System.out.println(key + "|" + value);
    }

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

相關(guān)文章

  • Java停止線程的3種方法

    Java停止線程的3種方法

    這篇文章主要分享Java停止線程的3種方法,分別是自定義中斷標識符,停止線程、使用線程中斷方法interrupt停止線程、使用stop停止線程。下文詳細介紹需要的小伙伴可以參考一下
    2022-05-05
  • Spring?BeanFactory工廠使用教程

    Spring?BeanFactory工廠使用教程

    Spring的本質(zhì)是一個bean工廠(beanFactory)或者說bean容器,它按照我們的要求,生產(chǎn)我們需要的各種各樣的bean,提供給我們使用。只是在生產(chǎn)bean的過程中,需要解決bean之間的依賴問題,才引入了依賴注入(DI)這種技術(shù)
    2023-02-02
  • Java多線程中的互斥鎖解析

    Java多線程中的互斥鎖解析

    這篇文章主要介紹了Java多線程中的互斥鎖解析,Java語言中,引入了對象互斥鎖的概念,來保證共享數(shù)據(jù)操作的完整性,每個對象都對應(yīng)于一個可稱為互斥鎖的標記,這個標記用來保證在任一時刻,只能有一個線程訪問該對象,需要的朋友可以參考下
    2023-09-09
  • 利用maven deploy上傳本地jar至私服的方法

    利用maven deploy上傳本地jar至私服的方法

    這篇文章主要介紹了利用maven deploy上傳本地jar至私服的方法,本文結(jié)合實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2023-02-02
  • SpringBoot集成Jpa對數(shù)據(jù)進行排序、分頁、條件查詢和過濾操作

    SpringBoot集成Jpa對數(shù)據(jù)進行排序、分頁、條件查詢和過濾操作

    這篇文章主要介紹了SpringBoot集成Jpa對數(shù)據(jù)進行排序、分頁、條件查詢和過濾操作,主要使用Jpa連接數(shù)據(jù)庫對數(shù)據(jù)進行排序、分頁、條件查詢和過濾操作,需要的朋友可以參考下
    2023-05-05
  • SpringBoot項目部署到騰訊云的實現(xiàn)步驟

    SpringBoot項目部署到騰訊云的實現(xiàn)步驟

    本文主要介紹了SpringBoot項目部署到騰訊云的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • Java?LocalDateTime常用操作方法

    Java?LocalDateTime常用操作方法

    這篇文章主要介紹了Java?LocalDateTime實用方法,Java8提供了新的時間接口LocalDateTime,本文通過實例代碼給大家介紹的非常詳細,需要的朋友可以參考下
    2022-01-01
  • Java中Integer.parseInt和Integer.valueOf區(qū)別小結(jié)

    Java中Integer.parseInt和Integer.valueOf區(qū)別小結(jié)

    在Java中,Integer.parseInt()和Integer.valueOf()都可以將字符串轉(zhuǎn)換為整數(shù)類型,那么他們有哪些區(qū)別呢,本文就來詳細的介紹一下
    2023-09-09
  • SpringBoot實現(xiàn)微信及QQ綁定登錄的示例代碼

    SpringBoot實現(xiàn)微信及QQ綁定登錄的示例代碼

    本文主要介紹了SpringBoot實現(xiàn)微信及QQ綁定登錄的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • SpringBoot中整合MyBatis-Plus的方法示例

    SpringBoot中整合MyBatis-Plus的方法示例

    這篇文章主要介紹了SpringBoot中整合MyBatis-Plus的方法示例,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-09-09

最新評論

威宁| 富民县| 广元市| 太仓市| 宜兰县| 海安县| 横峰县| 自治县| 巴楚县| 肇庆市| 龙门县| 防城港市| 盈江县| 桦甸市| 常山县| 大悟县| 宜章县| 仙桃市| 湖北省| 白朗县| 根河市| 瓦房店市| 东辽县| 宣汉县| 蕲春县| 和政县| 宜良县| 香河县| 澜沧| 日照市| 永定县| 保德县| 东乌| 巴里| 永仁县| 杭锦旗| 特克斯县| 辽源市| 安陆市| 鄂伦春自治旗| 嘉定区|