日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

深入理解HashMap和LinkedHashMap的区别

發布時間:2024/2/28 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入理解HashMap和LinkedHashMap的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 簡介
  • LinkedHashMap詳解
  • 插入
  • 訪問
  • removeEldestEntry
  • 總結

深入理解HashMap和LinkedHashMap的區別

簡介

我們知道HashMap的變量順序是不可預測的,這意味著便利的輸出順序并不一定和HashMap的插入順序是一致的。這個特性通常會對我們的工作造成一定的困擾。為了實現這個功能,我們可以使用LinkedHashMap。

LinkedHashMap詳解

先看下LinkedHashMap的定義:

public class LinkedHashMap<K,V>extends HashMap<K,V>implements Map<K,V>

LinkedHashMap繼承自HashMap,所以HashMap的所有功能在LinkedHashMap都可以用。

LinkedHashMap和HashMap的區別就是新創建了一個Entry:

static class Entry<K,V> extends HashMap.Node<K,V> {Entry<K,V> before, after;Entry(int hash, K key, V value, Node<K,V> next) {super(hash, key, value, next);}}

這個Entry繼承自HashMap.Node,多了一個before,after來實現Node之間的連接。

通過這個新創建的Entry,就可以保證遍歷的順序和插入的順序一致。

插入

下面看一個LinkedHashMap插入的例子:

@Testpublic void insertOrder(){LinkedHashMap<String, String> map = new LinkedHashMap<>();map.put("ddd","desk");map.put("aaa","ask");map.put("ccc","check");map.keySet().forEach(System.out::println);}

輸出結果:

ddd aaa ccc

可以看到輸出結果和插入結果是一致的。

訪問

除了遍歷的順序,LinkedHashMap還有一個非常有特色的訪問順序。

我們再看一個LinkedHashMap的構造函數:

public LinkedHashMap(int initialCapacity,float loadFactor,boolean accessOrder) {super(initialCapacity, loadFactor);this.accessOrder = accessOrder;}

前面的兩個參數initialCapacity,loadFactor我們之前已經講過了,現在看最后一個參數accessOrder。

當accessOrder設置成為true的時候,就開啟了 access-order。

access order的意思是,將對象安裝最老訪問到最新訪問的順序排序。我們看個例子:

@Testpublic void accessOrder(){LinkedHashMap<String, String> map = new LinkedHashMap<>(16, .75f, true);map.put("ddd","desk");map.put("aaa","ask");map.put("ccc","check");map.keySet().forEach(System.out::println);map.get("aaa");map.keySet().forEach(System.out::println);}

輸出結果:

ddd aaa ccc ddd ccc aaa

我們看到,因為訪問了一次“aaa“,從而導致遍歷的時候排到了最后。

removeEldestEntry

最后我們看一下LinkedHashMap的一個特別的功能removeEldestEntry。這個方法是干什么的呢?

通過重新removeEldestEntry方法,可以讓LinkedHashMap保存特定數目的Entry,通常用在LinkedHashMap用作緩存的情況。

removeEldestEntry將會刪除最老的Entry,保留最新的。

ublic class CustLinkedHashMap<K, V> extends LinkedHashMap<K, V> {private static final int MAX_ENTRIES = 10;public CustLinkedHashMap(int initialCapacity, float loadFactor, boolean accessOrder) {super(initialCapacity, loadFactor, accessOrder);}@Overrideprotected boolean removeEldestEntry(Map.Entry eldest) {return size() > MAX_ENTRIES;} }

看上面的一個自定義的例子,上面的例子我們創建了一個保留10個Entry節點的LinkedHashMap。

總結

LinkedHashMap繼承自HashMap,同時提供了兩個非常有用的功能。

本文的例子https://github.com/ddean2009/learn-java-collections

更多精彩內容且看:

  • 區塊鏈從入門到放棄系列教程-涵蓋密碼學,超級賬本,以太坊,Libra,比特幣等持續更新
  • Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續更新
  • Spring 5.X系列教程:滿足你對Spring5的一切想象-持續更新
  • java程序員從小工到專家成神之路(2020版)-持續更新中,附詳細文章教程

歡迎關注我的公眾號:程序那些事,更多精彩等著您!
更多內容請訪問 www.flydean.com

總結

以上是生活随笔為你收集整理的深入理解HashMap和LinkedHashMap的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。