• Map.Entry<K,V>分析


    一。好处

    你是否已经对每次从Map中取得关键字然后再取得相应的值感觉厌倦?

    1 Set keys = map.keySet( );
    2 if(keys != null) {
    3     Iterator iterator = keys.iterator( );
    4    while(iterator.hasNext( )) {
    5            Object key = iterator.next( );
    6            Object value = map.get(key);
    7      }
    8 } 

    二。用法

    使用Map.Entry类,你可以得到在同一时间得到所有的信息。标准的Map访问方法如下:

    1   for( Entry<Integer, Integer> e : mm.entrySet()){
    2       System.out.println("key:"+e.getKey() + "  value:"+e.getValue());
    3      
    4    }
    5    for( Iterator<Entry<Integer, Integer>> i = mm.entrySet().iterator();i.hasNext(); ){
    6       Entry<Integer, Integer> e = i.next();
    7       System.out.println("key:"+e.getKey() + "  value:"+e.getValue());
    8 
    9    }

    三。分析

    1.HashMap内部静态类Entry的成员变量和构造函数

     1     static class Entry<K,V> implements Map.Entry<K,V> {
     2         final K key;
     3         V value;
     4         Entry<K,V> next;
     5         final int hash;
     6 
     7         /**
     8          * Creates new entry.
     9          */
    10         Entry(int h, K k, V v, Entry<K,V> n) {
    11             value = v;
    12             next = n;
    13             key = k;
    14             hash = h;
    15         }
    16       
    17          。。。。。
    18      }

    2.Iterator

     1     private final class ValueIterator extends HashIterator<V> {
     2         public V next() {
     3             return nextEntry().value;
     4         }
     5     }
     6 
     7     private final class KeyIterator extends HashIterator<K> {
     8         public K next() {
     9             return nextEntry().getKey();
    10         }
    11     }
    12 
    13     private final class EntryIterator extends HashIterator<Map.Entry<K,V>> {
    14         public Map.Entry<K,V> next() {
    15             return nextEntry();
    16         }
    17     }

    3.HashIterator,注意快速报错机制实现

     1     private abstract class HashIterator<E> implements Iterator<E> {
     2         Entry<K,V> next;    // next entry to return
     3         int expectedModCount;    // For fast-fail
     4         int index;        // current slot
     5         Entry<K,V> current;    // current entry
     6 
     7         HashIterator() {
     8             expectedModCount = modCount;
     9             if (size > 0) { // advance to first entry
    10                 Entry[] t = table;
    11                 while (index < t.length && (next = t[index++]) == null)
    12                     ;
    13             }
    14         }
    15 
    16         public final boolean hasNext() {
    17             return next != null;
    18         }
    19 
    20         final Entry<K,V> nextEntry() {
    21             if (modCount != expectedModCount)
    22                 throw new ConcurrentModificationException();
    23             Entry<K,V> e = next;
    24             if (e == null)
    25                 throw new NoSuchElementException();
    26 
    27             if ((next = e.next) == null) {
    28                 Entry[] t = table;
    29                 while (index < t.length && (next = t[index++]) == null)
    30                     ;
    31             }
    32             current = e;
    33             return e;
    34         }
    35 
    36         public void remove() {
    37             if (current == null)
    38                 throw new IllegalStateException();
    39             if (modCount != expectedModCount)
    40                 throw new ConcurrentModificationException();
    41             Object k = current.key;
    42             current = null;
    43             HashMap.this.removeEntryForKey(k);
    44             expectedModCount = modCount;
    45         }
    46 
    47     }

     3.EntrySet

     1     private final class EntrySet extends AbstractSet<Map.Entry<K,V>> {
     2         public Iterator<Map.Entry<K,V>> iterator() {
     3             return newEntryIterator();                                                 //创建EntryIterator
     4         }
     5         public boolean contains(Object o) {
     6             if (!(o instanceof Map.Entry))
     7                 return false;
     8             Map.Entry<K,V> e = (Map.Entry<K,V>) o;
     9             Entry<K,V> candidate = getEntry(e.getKey());
    10             return candidate != null && candidate.equals(e);
    11         }
    12         public boolean remove(Object o) {
    13             return removeMapping(o) != null;
    14         }
    15         public int size() {
    16             return size;
    17         }
    18         public void clear() {
    19             HashMap.this.clear();
    20         }
    21     }
  • 相关阅读:
    brew
    hbase
    YARN常见问题以及解决方案
    mybatis中foreach collection三种用法
    mysql按分隔符输出多行
    mysql DATETIME
    iis 之给网站添加MIME映射
    VS2019专业版和企业版激活密钥
    ViewData对于从后台传list到前台的使用
    找出每组数据中不同distinct
  • 原文地址:https://www.cnblogs.com/yuyutianxia/p/3839806.html
Copyright © 2020-2023  润新知