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

分析HashMap 的 JDK 源碼

 更新時(shí)間:2020年10月12日 10:29:23   作者:CodingDiary  
這篇文章主要分析了HashMap 的 JDK 源碼,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下

緣由:今天好友拿著下面的代碼,問我為什么 Map.Entry 這個(gè)接口沒有實(shí)現(xiàn) getKey() 和 getValue() 方法,卻可以使用,由此,開啟了一番查閱 JDK 源碼的旅途….

Map map = new HashMap();
  
map.put(1, "張三");
map.put(2, "李四");
map.put(3, "王五");
map.put(4, "趙六");
map.put(5, "錢七");
  
Set set = map.entrySet();
for (Object object : set) {
  Map.Entry entry = (Map.Entry) object;
  System.out.println(entry.getKey() + "-->" + entry.getValue());
}

1.首先,我們看 map 對(duì)象,這個(gè) map 對(duì)象是 HashMap 的一個(gè)實(shí)例,然后下面的 Set set = map.entrySet(); 可以知道這其實(shí)用的 HashMap 實(shí)現(xiàn)的 entrySet() 方法,然后我們可以查看 HashMap 里 entrySet() 的源碼

從源碼可以看出,這里的返回了一個(gè) EntrySet 對(duì)象,但是需要注意的是這個(gè) EntrySetHashMap 里的一個(gè)內(nèi)部類,源碼如下:

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();
  }

  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 new EntrySpliterator<>(HashMap.this, 0, -1, 0, 0);
  }

  public final void forEach(Consumer<? super Map.Entry<K,V>> action) {
    Node<K,V>[] tab;
    if (action == null)
      throw new NullPointerException();
    if (size > 0 && (tab = table) != null) {
      int mc = modCount;
      for (int i = 0; i < tab.length; ++i) {
        for (Node<K,V> e = tab[i]; e != null; e = e.next)
          action.accept(e);
      }
      if (modCount != mc)
        throw new ConcurrentModificationException();
    }
  }
}

從這里我們是可以看出,這個(gè) EntrySet 其實(shí)是封裝的一個(gè) Node 類的實(shí)體。也就是說我們的 set 其實(shí)就是這個(gè) Node 對(duì)象。

2.現(xiàn)在我們來說說這個(gè) Node 對(duì)象,Node 對(duì)象也是 HashMap 里的一個(gè)內(nèi)部類,源碼如下:

static class Node<K,V> implements Map.Entry<K,V> {
  final int hash;
  final K key;
  V value;
  Node<K,V> next;

  Node(int hash, K key, V value, Node<K,V> next) {
    this.hash = hash;
    this.key = key;
    this.value = value;
    this.next = next;
  }

  public final K getKey() {
    return key;
  }

  public final V getValue() {
    return value;
  }

  public final String toString() {
    return key + "=" + value;
  }

  public final int hashCode() {
    return Objects.hashCode(key) ^ Objects.hashCode(value);
  }

  public final V setValue(V newValue) {
    V oldValue = value;
    value = newValue;
    return oldValue;
  }

  public final boolean equals(Object o) {
    if (o == this)
      return true;
    if (o instanceof Map.Entry) {
      Map.Entry<?,?> e = (Map.Entry<?,?>)o;
      if (Objects.equals(key, e.getKey()) &&
        Objects.equals(value, e.getValue()))
        return true;
    }
    return false;
  }
}

可以看出來,這個(gè) Node 對(duì)象是 Map.Entry<K,V> 的實(shí)現(xiàn)類,我們可以看到這個(gè) Node 對(duì)象實(shí)現(xiàn)了 getKey() getValue() 的方法,所以后面調(diào)用的 entry.getKey() 以及 entry.getValue() 方法其實(shí)都是調(diào)用的 Node 對(duì)象里的getKey()getValue() 方法,這里就是 Java 的多態(tài)的一種表現(xiàn)。

3.至此,打完收槍!

以上就是分析HashMap 的 JDK 源碼的詳細(xì)內(nèi)容,更多關(guān)于HashMap 的 JDK 源碼的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評(píng)論

舟曲县| 得荣县| 突泉县| 中山市| 苗栗县| 莱州市| 南江县| 北京市| 宣恩县| 遵义市| 石景山区| 清新县| 汶上县| 宜章县| 临泽县| 西乌| 沂南县| 翁源县| 仁寿县| 绿春县| 华阴市| 共和县| 阳城县| 兴安盟| 五华县| 任丘市| 岫岩| 南郑县| 万安县| 绥化市| 陵川县| 长葛市| 金华市| 三河市| 怀宁县| 朔州市| 东海县| 平乡县| 定安县| 临安市| 南木林县|