Java LinkedHashMap深入分析源碼
一、LinkedHashMap的類繼承關(guān)系

二、源碼分析
1.自己對LinkedHashMap的理解
從繼承關(guān)系上,我們看到LinkedHashMap繼承了HashMap,它里面的增刪改差遍歷的邏輯都是使用的HashMap中的,但是LinkedHashMap比HashMap多了一個(gè)雙向鏈,這個(gè)雙向鏈?zhǔn)菑牡谝粋€(gè)插入的元素開始按照插入順序,連接起來,所以可以說LinkedHashMap是可以保證插入順序的。
看圖:這里就簡單的給大家看一下這個(gè)鏈?zhǔn)巧稑拥模划嫾t黑樹了

2.如何做到雙向鏈的增刪改查
(1).增
1).是在創(chuàng)建新節(jié)點(diǎn)的時(shí)候,把雙向鏈連接起來,注意有兩種節(jié)點(diǎn)一個(gè)是TreeNode一個(gè)普通Node
源碼:
Node<K,V> newNode(int hash, K key, V value, Node<K,V> e) {
LinkedHashMap.Entry<K,V> p =
new LinkedHashMap.Entry<K,V>(hash, key, value, e);
linkNodeLast(p);
return p;
}
TreeNode<K,V> newTreeNode(int hash, K key, V value, Node<K,V> next) {
TreeNode<K,V> p = new TreeNode<K,V>(hash, key, value, next);
linkNodeLast(p);
return p;
}
private void linkNodeLast(LinkedHashMap.Entry<K,V> p) {
LinkedHashMap.Entry<K,V> last = tail;
tail = p;
if (last == null)
head = p;
else {
p.before = last;
last.after = p;
}
}
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);
}
}代碼太簡單了,這里簡單描述一下,就是添加新節(jié)點(diǎn)會創(chuàng)建Node,有兩種Node:TreeNode和普通Node(注意這里多態(tài)的使用普通Node和LinedHashMap.Entry和TreeNode的關(guān)系看一下就明白了),在創(chuàng)建之后放到雙向鏈最后面。
2).有好多人說了還有一個(gè)afterNodeInsertion方法,這個(gè)方法的名字就顯示是在插入之后調(diào)用的,是不是在這個(gè)方法中也有修改鏈表的邏輯,我們來看這個(gè)方法
void afterNodeInsertion(boolean evict) { // possibly remove eldest
LinkedHashMap.Entry<K,V> first;
if (evict && (first = head) != null && removeEldestEntry(first)) {
K key = first.key;
removeNode(hash(key), key, null, false, true);
}
}
protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
return false;
}看這個(gè)判斷,有一個(gè)永遠(yuǎn)是false,也就是說如果我們不重寫這個(gè)removeEldestEntry方法,那這個(gè)afterNodeInsertion方法里的邏輯永遠(yuǎn)不會執(zhí)行,那這個(gè)玩意兒是干啥的呢,看邏輯是用來移除最早的頭節(jié)點(diǎn)的,不知道為啥寫著么一段,默認(rèn)不會執(zhí)行!!!
(2).刪
void afterNodeRemoval(Node<K,V> e) { // unlink
LinkedHashMap.Entry<K,V> p =
(LinkedHashMap.Entry<K,V>)e, b = p.before, a = p.after; // b是當(dāng)前節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn),a是后一個(gè)節(jié)點(diǎn)
p.before = p.after = null; //先斷開當(dāng)前節(jié)點(diǎn),把當(dāng)前節(jié)點(diǎn)對上一個(gè)和下一個(gè)節(jié)點(diǎn)的引用置為空
if (b == null) //當(dāng)前節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)是null,說明當(dāng)前節(jié)點(diǎn)是頭節(jié)點(diǎn),那去掉當(dāng)前節(jié)點(diǎn)之后,當(dāng)前節(jié)點(diǎn)的后一個(gè)節(jié)點(diǎn)成為了鏈第一個(gè),
// 也就是頭節(jié)點(diǎn),當(dāng)然有可能a也是null,那整個(gè)鏈就是空鏈,這種寫法兼容了a也是null的情況
head = a;
else
b.after = a; //如果當(dāng)前節(jié)點(diǎn)不是頭節(jié)點(diǎn),直接去掉當(dāng)前節(jié)點(diǎn),當(dāng)前節(jié)點(diǎn)的前一個(gè)和后一個(gè)連起來
if (a == null) //如果當(dāng)前節(jié)點(diǎn)的后一個(gè)節(jié)點(diǎn)是null,說明當(dāng)前節(jié)點(diǎn)是尾節(jié)點(diǎn),那把當(dāng)前節(jié)點(diǎn)去掉后,當(dāng)前節(jié)點(diǎn)的前一個(gè)節(jié)點(diǎn)成為了鏈的最后一個(gè)節(jié)點(diǎn)尾節(jié)點(diǎn)。
tail = b;
else
a.before = b;//如果當(dāng)前節(jié)點(diǎn)不是尾節(jié)點(diǎn),直接去掉當(dāng)前節(jié)點(diǎn),當(dāng)前節(jié)點(diǎn)的前一個(gè)和后一個(gè)連起來
}這個(gè)刪除我們看一下在哪里調(diào)用的:
final Node<K,V> removeNode(int hash, Object key, Object value,
boolean matchValue, boolean movable) {
...
if (node != null && (!matchValue || (v = node.value) == value ||
(value != null && value.equals(v)))) {
if (node instanceof TreeNode)
((TreeNode<K,V>)node).removeTreeNode(this, tab, movable);
else if (node == p)
tab[index] = node.next;
else
p.next = node.next;
++modCount;
--size;
afterNodeRemoval(node); //??????
return node;
}
}
return null;
}在HashMap的removeNode方法里,當(dāng)時(shí)學(xué)習(xí)HashMap的時(shí)候還是有疑惑的這個(gè)方法干啥使的,還是一個(gè)沒有方法體的空實(shí)現(xiàn)方法,現(xiàn)在明白了,就是在給子類重寫呢,所以說LinkedHashMap增刪改查基本上全是HashMap的邏輯。
(3).改
有幾點(diǎn)要注意
1).首先聲明一點(diǎn)afterNodeAccess這個(gè)方法雖然在HashMap中改變鍵值對value值的時(shí)候都會調(diào)用,但是它和改變值沒啥關(guān)系,真正的改值的邏輯是HashMap中的例如putVal方法,這個(gè)方法只是在改完值之后調(diào)用一下
final V putVal(int hash, K key, V value, boolean onlyIfAbsent,
boolean evict) {
...
if (e != null) { // existing mapping for key
V oldValue = e.value;
if (!onlyIfAbsent || oldValue == null)
e.value = value;
afterNodeAccess(e); //????????
return oldValue;
}
}
++modCount;
if (++size > threshold)
resize();
afterNodeInsertion(evict);
return null;
}2).afterNodeAccess的真正作用是把剛剛訪問過的節(jié)點(diǎn)放到雙向鏈的末尾,一旦執(zhí)行這個(gè)方法那就會打亂我們由插入順序形成的鏈表,這個(gè)邏輯執(zhí)不執(zhí)行由accessOrder變量控制
/**
* 此方法的作用是將剛剛訪問的節(jié)點(diǎn)e放到鏈表的尾端
*/
void afterNodeAccess(Node<K,V> e) {
LinkedHashMap.Entry<K,V> last;
// accessOrder = true 時(shí) 訪問節(jié)點(diǎn)后才需要置于尾端
// 如果e本身就在尾端,那就不需要操作
if (accessOrder && (last = tail) != e) {
// 記錄節(jié)點(diǎn)e、e的前驅(qū)、e的后繼
LinkedHashMap.Entry<K,V> p = (LinkedHashMap.Entry<K,V>)e, b = p.before, a = p.after;
// 第一步:現(xiàn)將p.after置空
p.after = null;
// 第二步:將e的前驅(qū).after 連接上e的后繼
if (b == null)
// b記錄e的前驅(qū),前驅(qū)為null,則e在表頭,head置為e的后繼
head = a;
else
// 否則 e的前驅(qū).after = e的后繼
b.after = a;
// 第三步:將e的后繼.before 連接上e的前驅(qū)
if (a != null)
// e的后繼 != null,將e后繼.before = e的前驅(qū)
a.before = b;
else
// 否則e的后繼 == null,即在e表尾(這里有點(diǎn)多余,前面已經(jīng)判斷在表尾不操作。。。)
last = b;
// 第四步:將節(jié)點(diǎn)e接入到鏈表的尾端
if (last == null)
// last == null,鏈表為空,head = p
head = p;
else {
// p.before 指向last(鏈表尾端),尾端.after = p
p.before = last;
last.after = p;
}
// 第四步:更新鏈表新尾端tail
tail = p;
// 鏈表結(jié)構(gòu)性調(diào)整,修改次數(shù)自增
++modCount;
}
}注意,到底會不會執(zhí)行這個(gè)方法,是由accessOrder變量控制,而這個(gè)變量只有在構(gòu)造方法中指定才會為ture,其他的構(gòu)造方法默認(rèn)都是false不執(zhí)行這段邏輯:
public LinkedHashMap(int initialCapacity, float loadFactor) {
super(initialCapacity, loadFactor);
accessOrder = false;
}
/**
* Constructs an empty insertion-ordered <tt>LinkedHashMap</tt> instance
* with the specified initial capacity and a default load factor (0.75).
*
* @param initialCapacity the initial capacity
* @throws IllegalArgumentException if the initial capacity is negative
*/
public LinkedHashMap(int initialCapacity) {
super(initialCapacity);
accessOrder = false;
}
/**
* Constructs an empty insertion-ordered <tt>LinkedHashMap</tt> instance
* with the default initial capacity (16) and load factor (0.75).
*/
public LinkedHashMap() {
super();
accessOrder = false;
}
/**
* Constructs an insertion-ordered <tt>LinkedHashMap</tt> instance with
* the same mappings as the specified map. The <tt>LinkedHashMap</tt>
* instance is created with a default load factor (0.75) and an initial
* capacity sufficient to hold the mappings in the specified map.
*
* @param m the map whose mappings are to be placed in this map
* @throws NullPointerException if the specified map is null
*/
public LinkedHashMap(Map<? extends K, ? extends V> m) {
super();
accessOrder = false;
putMapEntries(m, false);
}
/**
* Constructs an empty <tt>LinkedHashMap</tt> instance with the
* specified initial capacity, load factor and ordering mode.
*
* @param initialCapacity the initial capacity
* @param loadFactor the load factor
* @param accessOrder the ordering mode - <tt>true</tt> for
* access-order, <tt>false</tt> for insertion-order
* @throws IllegalArgumentException if the initial capacity is negative
* or the load factor is nonpositive
*/
public LinkedHashMap(int initialCapacity,
float loadFactor,
boolean accessOrder) {
super(initialCapacity, loadFactor);
this.accessOrder = accessOrder;
}(4).查
public V get(Object key) {
Node<K,V> e;
if ((e = getNode(hash(key), key)) == null)
return null;
if (accessOrder)
afterNodeAccess(e);
return e.value;
}
/**
* {@inheritDoc}
*/
public V getOrDefault(Object key, V defaultValue) {
Node<K,V> e;
if ((e = getNode(hash(key), key)) == null)
return defaultValue;
if (accessOrder)
afterNodeAccess(e);
return e.value;
}沒啥好說的,都是調(diào)用的HashMap的代碼。
3.遍歷
遍歷 和hashMap一樣,只不過重寫了一些方法,重寫是為了按插入順序遍歷
public Set<K> keySet() {
Set<K> ks = keySet;
if (ks == null) {
ks = new LinkedKeySet();
keySet = ks;
}
return ks;
}
final class LinkedKeySet extends AbstractSet<K> {
public final int size() { return size; }
public final void clear() { LinkedHashMap.this.clear(); }
public final Iterator<K> iterator() {
return new LinkedKeyIterator();
}
public final boolean contains(Object o) { return containsKey(o); }
public final boolean remove(Object key) {
return removeNode(hash(key), key, null, false, true) != null;
}
public final Spliterator<K> spliterator() {
return Spliterators.spliterator(this, Spliterator.SIZED |
Spliterator.ORDERED |
Spliterator.DISTINCT);
}
public final void forEach(Consumer<? super K> action) {
if (action == null)
throw new NullPointerException();
int mc = modCount;
for (LinkedHashMap.Entry<K,V> e = head; e != null; e = e.after)
action.accept(e.key);
if (modCount != mc)
throw new ConcurrentModificationException();
}
}
public Collection<V> values() {
Collection<V> vs = values;
if (vs == null) {
vs = new LinkedValues();
values = vs;
}
return vs;
}
final class LinkedValues extends AbstractCollection<V> {
public final int size() { return size; }
public final void clear() { LinkedHashMap.this.clear(); }
public final Iterator<V> iterator() {
return new LinkedValueIterator();
}
public final boolean contains(Object o) { return containsValue(o); }
public final Spliterator<V> spliterator() {
return Spliterators.spliterator(this, Spliterator.SIZED |
Spliterator.ORDERED);
}
public final void forEach(Consumer<? super V> action) {
if (action == null)
throw new NullPointerException();
int mc = modCount;
for (LinkedHashMap.Entry<K,V> e = head; e != null; e = e.after)
action.accept(e.value);
if (modCount != mc)
throw new ConcurrentModificationException();
}
}
/**
* Returns a {@link Set} view of the mappings contained in this map.
* The set is backed by the map, so changes to the map are
* reflected in the set, and vice-versa. If the map is modified
* while an iteration over the set is in progress (except through
* the iterator's own <tt>remove</tt> operation, or through the
* <tt>setValue</tt> operation on a map entry returned by the
* iterator) the results of the iteration are undefined. The set
* supports element removal, which removes the corresponding
* mapping from the map, via the <tt>Iterator.remove</tt>,
* <tt>Set.remove</tt>, <tt>removeAll</tt>, <tt>retainAll</tt> and
* <tt>clear</tt> operations. It does not support the
* <tt>add</tt> or <tt>addAll</tt> operations.
* Its {@link Spliterator} typically provides faster sequential
* performance but much poorer parallel performance than that of
* {@code HashMap}.
*
* @return a set view of the mappings contained in this map
*/
public Set<Map.Entry<K,V>> entrySet() {
Set<Map.Entry<K,V>> es;
return (es = entrySet) == null ? (entrySet = new LinkedEntrySet()) : es;
}
final class LinkedEntrySet extends AbstractSet<Map.Entry<K,V>> {
public final int size() { return size; }
public final void clear() { LinkedHashMap.this.clear(); }
public final Iterator<Map.Entry<K,V>> iterator() {
return new LinkedEntryIterator();
}
public final boolean contains(Object o) {
if (!(o instanceof Map.Entry))
return false;
Map.Entry<?,?> e = (Map.Entry<?,?>) o;
Object key = e.getKey();
Node<K,V> candidate = getNode(hash(key), key);
return candidate != null && candidate.equals(e);
}
public final boolean remove(Object o) {
if (o instanceof Map.Entry) {
Map.Entry<?,?> e = (Map.Entry<?,?>) o;
Object key = e.getKey();
Object value = e.getValue();
return removeNode(hash(key), key, value, true, true) != null;
}
return false;
}
public final Spliterator<Map.Entry<K,V>> spliterator() {
return Spliterators.spliterator(this, Spliterator.SIZED |
Spliterator.ORDERED |
Spliterator.DISTINCT);
}
public final void forEach(Consumer<? super Map.Entry<K,V>> action) {
if (action == null)
throw new NullPointerException();
int mc = modCount;
for (LinkedHashMap.Entry<K,V> e = head; e != null; e = e.after)
action.accept(e);
if (modCount != mc)
throw new ConcurrentModificationException();
}
}
// Map overrides
public void forEach(BiConsumer<? super K, ? super V> action) {
if (action == null)
throw new NullPointerException();
int mc = modCount;
for (LinkedHashMap.Entry<K,V> e = head; e != null; e = e.after)
action.accept(e.key, e.value);
if (modCount != mc)
throw new ConcurrentModificationException();
}
public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
if (function == null)
throw new NullPointerException();
int mc = modCount;
for (LinkedHashMap.Entry<K,V> e = head; e != null; e = e.after)
e.value = function.apply(e.key, e.value);
if (modCount != mc)
throw new ConcurrentModificationException();
}簡單測試一下,是不是按順序遍歷:
public class LinkedHashMapTestMain {
public static void main(String[] args) {
LinkedHashMap<String,String> linkedHashMap = new LinkedHashMap<>();
for (int i = 0; i < 100; i++) {
linkedHashMap.put(i + "", i + "");
}
//第一種entrySet
Set<Map.Entry<String, String>> entrySet = linkedHashMap.entrySet();
Iterator<Map.Entry<String, String>> iterator = entrySet.iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> entry = iterator.next();
System.out.println("entrySet: " + "key: " + entry.getKey() + "--- value: " + entry.getValue());
}
for (Map.Entry<String, String> entry : entrySet){
System.out.println("entrySet forEach循環(huán): " + "key: " + entry.getKey() + "--- value: " + entry.getValue());
}
//第二種keySet
Set<String> keySet = linkedHashMap.keySet();
Iterator<String> keySetIterator = keySet.iterator();
while (keySetIterator.hasNext()){
String key = keySetIterator.next();
System.out.println("keySet: " + "key: " + key + "--- value: " + linkedHashMap.get(key));
}
for (String key : keySet){
System.out.println("keySet forEach循環(huán): " + "key: " + key + "--- value: " + linkedHashMap.get(key));
}
}
}執(zhí)行結(jié)果:
entrySet: key: 0--- value: 0
entrySet: key: 1--- value: 1
entrySet: key: 2--- value: 2
entrySet: key: 3--- value: 3
entrySet: key: 4--- value: 4
entrySet: key: 5--- value: 5
entrySet: key: 6--- value: 6
entrySet: key: 7--- value: 7
entrySet: key: 8--- value: 8
entrySet: key: 9--- value: 9
entrySet: key: 10--- value: 10
entrySet: key: 11--- value: 11
entrySet: key: 12--- value: 12
entrySet: key: 13--- value: 13
entrySet: key: 14--- value: 14
entrySet: key: 15--- value: 15
entrySet: key: 16--- value: 16
entrySet: key: 17--- value: 17
entrySet: key: 18--- value: 18
entrySet: key: 19--- value: 19
entrySet: key: 20--- value: 20
entrySet: key: 21--- value: 21
entrySet: key: 22--- value: 22
entrySet: key: 23--- value: 23
entrySet: key: 24--- value: 24
entrySet: key: 25--- value: 25
entrySet: key: 26--- value: 26
entrySet: key: 27--- value: 27
entrySet: key: 28--- value: 28
entrySet: key: 29--- value: 29
entrySet: key: 30--- value: 30
entrySet: key: 31--- value: 31
entrySet: key: 32--- value: 32
entrySet: key: 33--- value: 33
entrySet: key: 34--- value: 34
entrySet: key: 35--- value: 35
entrySet: key: 36--- value: 36
entrySet: key: 37--- value: 37
entrySet: key: 38--- value: 38
entrySet: key: 39--- value: 39
entrySet: key: 40--- value: 40
entrySet: key: 41--- value: 41
entrySet: key: 42--- value: 42
entrySet: key: 43--- value: 43
entrySet: key: 44--- value: 44
entrySet: key: 45--- value: 45
entrySet: key: 46--- value: 46
entrySet: key: 47--- value: 47
entrySet: key: 48--- value: 48
entrySet: key: 49--- value: 49
entrySet: key: 50--- value: 50
entrySet: key: 51--- value: 51
entrySet: key: 52--- value: 52
entrySet: key: 53--- value: 53
entrySet: key: 54--- value: 54
entrySet: key: 55--- value: 55
entrySet: key: 56--- value: 56
entrySet: key: 57--- value: 57
entrySet: key: 58--- value: 58
entrySet: key: 59--- value: 59
entrySet: key: 60--- value: 60
entrySet: key: 61--- value: 61
entrySet: key: 62--- value: 62
entrySet: key: 63--- value: 63
entrySet: key: 64--- value: 64
entrySet: key: 65--- value: 65
entrySet: key: 66--- value: 66
entrySet: key: 67--- value: 67
entrySet: key: 68--- value: 68
entrySet: key: 69--- value: 69
entrySet: key: 70--- value: 70
entrySet: key: 71--- value: 71
entrySet: key: 72--- value: 72
entrySet: key: 73--- value: 73
entrySet: key: 74--- value: 74
entrySet: key: 75--- value: 75
entrySet: key: 76--- value: 76
entrySet: key: 77--- value: 77
entrySet: key: 78--- value: 78
entrySet: key: 79--- value: 79
entrySet: key: 80--- value: 80
entrySet: key: 81--- value: 81
entrySet: key: 82--- value: 82
entrySet: key: 83--- value: 83
entrySet: key: 84--- value: 84
entrySet: key: 85--- value: 85
entrySet: key: 86--- value: 86
entrySet: key: 87--- value: 87
entrySet: key: 88--- value: 88
entrySet: key: 89--- value: 89
entrySet: key: 90--- value: 90
entrySet: key: 91--- value: 91
entrySet: key: 92--- value: 92
entrySet: key: 93--- value: 93
entrySet: key: 94--- value: 94
entrySet: key: 95--- value: 95
entrySet: key: 96--- value: 96
entrySet: key: 97--- value: 97
entrySet: key: 98--- value: 98
entrySet: key: 99--- value: 99
entrySet forEach循環(huán): key: 0--- value: 0
entrySet forEach循環(huán): key: 1--- value: 1
entrySet forEach循環(huán): key: 2--- value: 2
entrySet forEach循環(huán): key: 3--- value: 3
entrySet forEach循環(huán): key: 4--- value: 4
entrySet forEach循環(huán): key: 5--- value: 5
entrySet forEach循環(huán): key: 6--- value: 6
entrySet forEach循環(huán): key: 7--- value: 7
entrySet forEach循環(huán): key: 8--- value: 8
entrySet forEach循環(huán): key: 9--- value: 9
entrySet forEach循環(huán): key: 10--- value: 10
entrySet forEach循環(huán): key: 11--- value: 11
entrySet forEach循環(huán): key: 12--- value: 12
entrySet forEach循環(huán): key: 13--- value: 13
entrySet forEach循環(huán): key: 14--- value: 14
entrySet forEach循環(huán): key: 15--- value: 15
entrySet forEach循環(huán): key: 16--- value: 16
entrySet forEach循環(huán): key: 17--- value: 17
entrySet forEach循環(huán): key: 18--- value: 18
entrySet forEach循環(huán): key: 19--- value: 19
entrySet forEach循環(huán): key: 20--- value: 20
entrySet forEach循環(huán): key: 21--- value: 21
entrySet forEach循環(huán): key: 22--- value: 22
entrySet forEach循環(huán): key: 23--- value: 23
entrySet forEach循環(huán): key: 24--- value: 24
entrySet forEach循環(huán): key: 25--- value: 25
entrySet forEach循環(huán): key: 26--- value: 26
entrySet forEach循環(huán): key: 27--- value: 27
entrySet forEach循環(huán): key: 28--- value: 28
entrySet forEach循環(huán): key: 29--- value: 29
entrySet forEach循環(huán): key: 30--- value: 30
entrySet forEach循環(huán): key: 31--- value: 31
entrySet forEach循環(huán): key: 32--- value: 32
entrySet forEach循環(huán): key: 33--- value: 33
entrySet forEach循環(huán): key: 34--- value: 34
entrySet forEach循環(huán): key: 35--- value: 35
entrySet forEach循環(huán): key: 36--- value: 36
entrySet forEach循環(huán): key: 37--- value: 37
entrySet forEach循環(huán): key: 38--- value: 38
entrySet forEach循環(huán): key: 39--- value: 39
entrySet forEach循環(huán): key: 40--- value: 40
entrySet forEach循環(huán): key: 41--- value: 41
entrySet forEach循環(huán): key: 42--- value: 42
entrySet forEach循環(huán): key: 43--- value: 43
entrySet forEach循環(huán): key: 44--- value: 44
entrySet forEach循環(huán): key: 45--- value: 45
entrySet forEach循環(huán): key: 46--- value: 46
entrySet forEach循環(huán): key: 47--- value: 47
entrySet forEach循環(huán): key: 48--- value: 48
entrySet forEach循環(huán): key: 49--- value: 49
entrySet forEach循環(huán): key: 50--- value: 50
entrySet forEach循環(huán): key: 51--- value: 51
entrySet forEach循環(huán): key: 52--- value: 52
entrySet forEach循環(huán): key: 53--- value: 53
entrySet forEach循環(huán): key: 54--- value: 54
entrySet forEach循環(huán): key: 55--- value: 55
entrySet forEach循環(huán): key: 56--- value: 56
entrySet forEach循環(huán): key: 57--- value: 57
entrySet forEach循環(huán): key: 58--- value: 58
entrySet forEach循環(huán): key: 59--- value: 59
entrySet forEach循環(huán): key: 60--- value: 60
entrySet forEach循環(huán): key: 61--- value: 61
entrySet forEach循環(huán): key: 62--- value: 62
entrySet forEach循環(huán): key: 63--- value: 63
entrySet forEach循環(huán): key: 64--- value: 64
entrySet forEach循環(huán): key: 65--- value: 65
entrySet forEach循環(huán): key: 66--- value: 66
entrySet forEach循環(huán): key: 67--- value: 67
entrySet forEach循環(huán): key: 68--- value: 68
entrySet forEach循環(huán): key: 69--- value: 69
entrySet forEach循環(huán): key: 70--- value: 70
entrySet forEach循環(huán): key: 71--- value: 71
entrySet forEach循環(huán): key: 72--- value: 72
entrySet forEach循環(huán): key: 73--- value: 73
entrySet forEach循環(huán): key: 74--- value: 74
entrySet forEach循環(huán): key: 75--- value: 75
entrySet forEach循環(huán): key: 76--- value: 76
entrySet forEach循環(huán): key: 77--- value: 77
entrySet forEach循環(huán): key: 78--- value: 78
entrySet forEach循環(huán): key: 79--- value: 79
entrySet forEach循環(huán): key: 80--- value: 80
entrySet forEach循環(huán): key: 81--- value: 81
entrySet forEach循環(huán): key: 82--- value: 82
entrySet forEach循環(huán): key: 83--- value: 83
entrySet forEach循環(huán): key: 84--- value: 84
entrySet forEach循環(huán): key: 85--- value: 85
entrySet forEach循環(huán): key: 86--- value: 86
entrySet forEach循環(huán): key: 87--- value: 87
entrySet forEach循環(huán): key: 88--- value: 88
entrySet forEach循環(huán): key: 89--- value: 89
entrySet forEach循環(huán): key: 90--- value: 90
entrySet forEach循環(huán): key: 91--- value: 91
entrySet forEach循環(huán): key: 92--- value: 92
entrySet forEach循環(huán): key: 93--- value: 93
entrySet forEach循環(huán): key: 94--- value: 94
entrySet forEach循環(huán): key: 95--- value: 95
entrySet forEach循環(huán): key: 96--- value: 96
entrySet forEach循環(huán): key: 97--- value: 97
entrySet forEach循環(huán): key: 98--- value: 98
entrySet forEach循環(huán): key: 99--- value: 99
keySet: key: 0--- value: 0
keySet: key: 1--- value: 1
keySet: key: 2--- value: 2
keySet: key: 3--- value: 3
keySet: key: 4--- value: 4
keySet: key: 5--- value: 5
keySet: key: 6--- value: 6
keySet: key: 7--- value: 7
keySet: key: 8--- value: 8
keySet: key: 9--- value: 9
keySet: key: 10--- value: 10
keySet: key: 11--- value: 11
keySet: key: 12--- value: 12
keySet: key: 13--- value: 13
keySet: key: 14--- value: 14
keySet: key: 15--- value: 15
keySet: key: 16--- value: 16
keySet: key: 17--- value: 17
keySet: key: 18--- value: 18
keySet: key: 19--- value: 19
keySet: key: 20--- value: 20
keySet: key: 21--- value: 21
keySet: key: 22--- value: 22
keySet: key: 23--- value: 23
keySet: key: 24--- value: 24
keySet: key: 25--- value: 25
keySet: key: 26--- value: 26
keySet: key: 27--- value: 27
keySet: key: 28--- value: 28
keySet: key: 29--- value: 29
keySet: key: 30--- value: 30
keySet: key: 31--- value: 31
keySet: key: 32--- value: 32
keySet: key: 33--- value: 33
keySet: key: 34--- value: 34
keySet: key: 35--- value: 35
keySet: key: 36--- value: 36
keySet: key: 37--- value: 37
keySet: key: 38--- value: 38
keySet: key: 39--- value: 39
keySet: key: 40--- value: 40
keySet: key: 41--- value: 41
keySet: key: 42--- value: 42
keySet: key: 43--- value: 43
keySet: key: 44--- value: 44
keySet: key: 45--- value: 45
keySet: key: 46--- value: 46
keySet: key: 47--- value: 47
keySet: key: 48--- value: 48
keySet: key: 49--- value: 49
keySet: key: 50--- value: 50
keySet: key: 51--- value: 51
keySet: key: 52--- value: 52
keySet: key: 53--- value: 53
keySet: key: 54--- value: 54
keySet: key: 55--- value: 55
keySet: key: 56--- value: 56
keySet: key: 57--- value: 57
keySet: key: 58--- value: 58
keySet: key: 59--- value: 59
keySet: key: 60--- value: 60
keySet: key: 61--- value: 61
keySet: key: 62--- value: 62
keySet: key: 63--- value: 63
keySet: key: 64--- value: 64
keySet: key: 65--- value: 65
keySet: key: 66--- value: 66
keySet: key: 67--- value: 67
keySet: key: 68--- value: 68
keySet: key: 69--- value: 69
keySet: key: 70--- value: 70
keySet: key: 71--- value: 71
keySet: key: 72--- value: 72
keySet: key: 73--- value: 73
keySet: key: 74--- value: 74
keySet: key: 75--- value: 75
keySet: key: 76--- value: 76
keySet: key: 77--- value: 77
keySet: key: 78--- value: 78
keySet: key: 79--- value: 79
keySet: key: 80--- value: 80
keySet: key: 81--- value: 81
keySet: key: 82--- value: 82
keySet: key: 83--- value: 83
keySet: key: 84--- value: 84
keySet: key: 85--- value: 85
keySet: key: 86--- value: 86
keySet: key: 87--- value: 87
keySet: key: 88--- value: 88
keySet: key: 89--- value: 89
keySet: key: 90--- value: 90
keySet: key: 91--- value: 91
keySet: key: 92--- value: 92
keySet: key: 93--- value: 93
keySet: key: 94--- value: 94
keySet: key: 95--- value: 95
keySet: key: 96--- value: 96
keySet: key: 97--- value: 97
keySet: key: 98--- value: 98
keySet: key: 99--- value: 99
keySet forEach循環(huán): key: 0--- value: 0
keySet forEach循環(huán): key: 1--- value: 1
keySet forEach循環(huán): key: 2--- value: 2
keySet forEach循環(huán): key: 3--- value: 3
keySet forEach循環(huán): key: 4--- value: 4
keySet forEach循環(huán): key: 5--- value: 5
keySet forEach循環(huán): key: 6--- value: 6
keySet forEach循環(huán): key: 7--- value: 7
keySet forEach循環(huán): key: 8--- value: 8
keySet forEach循環(huán): key: 9--- value: 9
keySet forEach循環(huán): key: 10--- value: 10
keySet forEach循環(huán): key: 11--- value: 11
keySet forEach循環(huán): key: 12--- value: 12
keySet forEach循環(huán): key: 13--- value: 13
keySet forEach循環(huán): key: 14--- value: 14
keySet forEach循環(huán): key: 15--- value: 15
keySet forEach循環(huán): key: 16--- value: 16
keySet forEach循環(huán): key: 17--- value: 17
keySet forEach循環(huán): key: 18--- value: 18
keySet forEach循環(huán): key: 19--- value: 19
keySet forEach循環(huán): key: 20--- value: 20
keySet forEach循環(huán): key: 21--- value: 21
keySet forEach循環(huán): key: 22--- value: 22
keySet forEach循環(huán): key: 23--- value: 23
keySet forEach循環(huán): key: 24--- value: 24
keySet forEach循環(huán): key: 25--- value: 25
keySet forEach循環(huán): key: 26--- value: 26
keySet forEach循環(huán): key: 27--- value: 27
keySet forEach循環(huán): key: 28--- value: 28
keySet forEach循環(huán): key: 29--- value: 29
keySet forEach循環(huán): key: 30--- value: 30
keySet forEach循環(huán): key: 31--- value: 31
keySet forEach循環(huán): key: 32--- value: 32
keySet forEach循環(huán): key: 33--- value: 33
keySet forEach循環(huán): key: 34--- value: 34
keySet forEach循環(huán): key: 35--- value: 35
keySet forEach循環(huán): key: 36--- value: 36
keySet forEach循環(huán): key: 37--- value: 37
keySet forEach循環(huán): key: 38--- value: 38
keySet forEach循環(huán): key: 39--- value: 39
keySet forEach循環(huán): key: 40--- value: 40
keySet forEach循環(huán): key: 41--- value: 41
keySet forEach循環(huán): key: 42--- value: 42
keySet forEach循環(huán): key: 43--- value: 43
keySet forEach循環(huán): key: 44--- value: 44
keySet forEach循環(huán): key: 45--- value: 45
keySet forEach循環(huán): key: 46--- value: 46
keySet forEach循環(huán): key: 47--- value: 47
keySet forEach循環(huán): key: 48--- value: 48
keySet forEach循環(huán): key: 49--- value: 49
keySet forEach循環(huán): key: 50--- value: 50
keySet forEach循環(huán): key: 51--- value: 51
keySet forEach循環(huán): key: 52--- value: 52
keySet forEach循環(huán): key: 53--- value: 53
keySet forEach循環(huán): key: 54--- value: 54
keySet forEach循環(huán): key: 55--- value: 55
keySet forEach循環(huán): key: 56--- value: 56
keySet forEach循環(huán): key: 57--- value: 57
keySet forEach循環(huán): key: 58--- value: 58
keySet forEach循環(huán): key: 59--- value: 59
keySet forEach循環(huán): key: 60--- value: 60
keySet forEach循環(huán): key: 61--- value: 61
keySet forEach循環(huán): key: 62--- value: 62
keySet forEach循環(huán): key: 63--- value: 63
keySet forEach循環(huán): key: 64--- value: 64
keySet forEach循環(huán): key: 65--- value: 65
keySet forEach循環(huán): key: 66--- value: 66
keySet forEach循環(huán): key: 67--- value: 67
keySet forEach循環(huán): key: 68--- value: 68
keySet forEach循環(huán): key: 69--- value: 69
keySet forEach循環(huán): key: 70--- value: 70
keySet forEach循環(huán): key: 71--- value: 71
keySet forEach循環(huán): key: 72--- value: 72
keySet forEach循環(huán): key: 73--- value: 73
keySet forEach循環(huán): key: 74--- value: 74
keySet forEach循環(huán): key: 75--- value: 75
keySet forEach循環(huán): key: 76--- value: 76
keySet forEach循環(huán): key: 77--- value: 77
keySet forEach循環(huán): key: 78--- value: 78
keySet forEach循環(huán): key: 79--- value: 79
keySet forEach循環(huán): key: 80--- value: 80
keySet forEach循環(huán): key: 81--- value: 81
keySet forEach循環(huán): key: 82--- value: 82
keySet forEach循環(huán): key: 83--- value: 83
keySet forEach循環(huán): key: 84--- value: 84
keySet forEach循環(huán): key: 85--- value: 85
keySet forEach循環(huán): key: 86--- value: 86
keySet forEach循環(huán): key: 87--- value: 87
keySet forEach循環(huán): key: 88--- value: 88
keySet forEach循環(huán): key: 89--- value: 89
keySet forEach循環(huán): key: 90--- value: 90
keySet forEach循環(huán): key: 91--- value: 91
keySet forEach循環(huán): key: 92--- value: 92
keySet forEach循環(huán): key: 93--- value: 93
keySet forEach循環(huán): key: 94--- value: 94
keySet forEach循環(huán): key: 95--- value: 95
keySet forEach循環(huán): key: 96--- value: 96
keySet forEach循環(huán): key: 97--- value: 97
keySet forEach循環(huán): key: 98--- value: 98
keySet forEach循環(huán): key: 99--- value: 99
到此這篇關(guān)于Java LinkedHashMap深入分析源碼的文章就介紹到這了,更多相關(guān)Java LinkedHashMap內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
聊聊Springboot2.x的session和cookie有效期
這篇文章主要介紹了Springboot2.x的session和cookie有效期,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09
java數(shù)據(jù)類型與二進(jìn)制詳細(xì)介紹
這篇文章主要介紹了java數(shù)據(jù)類型與二進(jìn)制詳細(xì)介紹的相關(guān)資料,這里對數(shù)據(jù)類型進(jìn)行了一一介紹分析,并說明自動轉(zhuǎn)換和強(qiáng)制轉(zhuǎn)換,需要的朋友可以參考下2017-07-07
如何使用JAVA實(shí)現(xiàn)數(shù)字水印
本文介紹了如何使用JAVA實(shí)現(xiàn)數(shù)字水印,主要用到了java.awt包中的AlphaComposite類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2015-07-07
SpringBoot整合sharding-jdbc實(shí)現(xiàn)自定義分庫分表的實(shí)踐
本文主要介紹了SpringBoot整合sharding-jdbc實(shí)現(xiàn)自定義分庫分表的實(shí)踐,將通過自定義算法來實(shí)現(xiàn)定制化的分庫分表來擴(kuò)展相應(yīng)業(yè)務(wù),感興趣的可以了解一下2021-11-11
Java?中導(dǎo)入excel時(shí)使用?trim()?無法去除空格的問題解決方案
這篇文章主要介紹了Java中導(dǎo)入excel時(shí)使用trim()無法去除空格的解決方法,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-06-06
Java實(shí)現(xiàn)一個(gè)簡單的線程池代碼示例
線程池是管理線程的一個(gè)池子,通過阻塞隊(duì)列管理任務(wù),主要參數(shù)包括corePoolSize、maximumPoolSize、keepAliveTime等,這篇文章主要介紹了Java實(shí)現(xiàn)一個(gè)簡單的線程池的相關(guān)資料,需要的朋友可以參考下2024-09-09
Java數(shù)據(jù)結(jié)構(gòu)之二叉查找樹的實(shí)現(xiàn)
二叉查找樹(亦稱二叉搜索樹、二叉排序樹)是一棵二叉樹,且各結(jié)點(diǎn)關(guān)鍵詞互異,其中根序列按其關(guān)鍵詞遞增排列。本文將通過示例詳細(xì)講解二叉查找樹,感興趣的可以了解一下2022-03-03

