在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/Java/ jdk1.8 hashMap是如何來(lái)維護(hù)entrySet的

jdk1.8 hashMap是如何來(lái)維護(hù)entrySet的

1.經(jīng)過(guò)翻看hashMap的源碼,發(fā)現(xiàn)并沒(méi)有主動(dòng)地去維護(hù)entrySet,比如put的時(shí)候去存值或者調(diào)用entrySet()去維護(hù)值,那entryset的值從哪而來(lái)呢?

2.hashMap源碼

public Set<Map.Entry<K,V>> entrySet() {
        Set<Map.Entry<K,V>> es;
        return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;
    }
final class EntrySet extends AbstractSet<Map.Entry<K,V>> {
        public final int size()                 { return size; }
        public final void clear()               { HashMap.this.clear(); }
        public final Iterator<Map.Entry<K,V>> iterator() {
            return new EntryIterator();
        }
    }

3.本人的測(cè)試?yán)?

        Map map = new HashMap();
        map.put(1, 1);
        map.put(2, 2);
        Set set = map.entrySet();
        Iterator iterator = set.iterator();

debug發(fā)現(xiàn)這個(gè)時(shí)候set已經(jīng)有值了,很是費(fèi)解。iterator也在調(diào)用next方法之前就能看到值。

//iterator源碼
public final Iterator<Map.Entry<K,V>> iterator() {
            return new EntryIterator();
        }
 final class EntryIterator extends HashIterator
        implements Iterator<Map.Entry<K,V>> {
        public final Map.Entry<K,V> next() { return nextNode(); }
    }

4.感覺(jué)自己說(shuō)的好混亂,再來(lái)闡述一遍問(wèn)題,entrySet還有它的iterator是怎么維護(hù)的?

回答
編輯回答
熊出沒(méi)

new HashMap<>()的時(shí)候 entrySet就已經(jīng)不為null了 不知道是不是底層賦值的?

2018年1月18日 05:40
編輯回答
風(fēng)畔

圖片描述

clipboard.png
jdk1.8.0_101 在執(zhí)行iterator()之前,set就有值了

2017年3月19日 21:13
編輯回答
幼梔

我看了一下,理解如下

public Set<Map.Entry<K,V>> entrySet() {
        Set<Map.Entry<K,V>> es;
        return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;
    }

當(dāng)你調(diào)用這個(gè)方法時(shí)

clipboard.png
會(huì)初始化一個(gè) EntrySet。

public final Iterator<Map.Entry<K,V>> iterator() {
            return new EntryIterator();
        }

你調(diào)用 iterator()時(shí)會(huì)初始化一個(gè) EntryIterator。

  final class EntryIterator extends HashIterator
        implements Iterator<Map.Entry<K,V>> {
        public final Map.Entry<K,V> next() { return nextNode(); }
    }

這個(gè) EntryIterator 是直接調(diào)用的 HashMap.HashIterator.nextNode()
初始化 EntryIterator 時(shí)會(huì)初識(shí)化其父類 HashIterator

   HashIterator() {
            expectedModCount = modCount;
            Node<K,V>[] t = table;//這里會(huì)存儲(chǔ)相關(guān)的數(shù)據(jù)
            current = next = null;
            index = 0;
            if (t != null && size > 0) { // advance to first entry
                do {} while (index < t.length && (next = t[index++]) == null);
            }
        }

clipboard.png
put的時(shí)候會(huì)向這個(gè) table 中維護(hù),所以不需要維護(hù) EntrySet 因?yàn)樗旧聿恍枰鎯?chǔ)數(shù)據(jù)

2018年2月4日 04:05