首页 > 代码库 > Map.Entry<K,V>分析
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 =http://www.mamicode.com/ 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 =http://www.mamicode.com/ 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 entry10 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 }
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。