关于HashMap的实现这里就不展开了,详细可以参考JDK7与JDK8中HashMap的实现
JDK8之前,可以利用keySet可能entrySet来遍历HashMap,JDK8中引入了map.foreach来举办遍历。
原因:
keySet其实是遍历了2次,一次是转为Iterator工具,另一次是从hashMap中取出key所对应的value。而entrySet只是遍历了一次就把key和value都放到了entry中,劳务派遣管理系统,效率更高。假如是JDK8,利用Map.foreach要领。
1. keySet和entrySet
1.1 根基用法
keySet:
Map map=new HashMap(); Iterator it=map.keySet().iterator(); Object key; Object value; while(it.hasNext()){ key=it.next(); value=map.get(key); System.out.println(key+":"+value); }
entrySet:
Map map=new HashMap(); Iterator it=map.entrySet().iterator(); Object key; Object value; while(it.hasNext()){ Map.Entry entry = (Map.Entry)it.next(); key=entry.getKey(); value=entry.getValue(); System.out.println(key+"="+value); }
源码上看:
keySet:
final class KeyIterator extends HashIterator implements Iterator<K> { public final K next() { return nextNode().key; } }
entrySet:
final class EntryIterator extends HashIterator implements Iterator<Map.Entry<K,V>> { public final Map.Entry<K,V> next() { return nextNode(); } }
其实这里已经很明明晰,当要获得某个value时,软件开发,keySet还需要从HashMap中get,entrySet对比keySet少了遍历table的进程,软件开发,这也是两者机能上的主要不同。
2. Map.foreach
在JDK8今后,引入了Map.foreach。
Map.foreach本质仍然是entrySet
default void forEach(BiConsumer<? super K, ? super V> action) { Objects.requireNonNull(action); for (Map.Entry<K, V> entry : entrySet()) { K k; V v; try { k = entry.getKey(); v = entry.getValue(); } catch(IllegalStateException ise) { // this usually means the entry is no longer in the map. throw new ConcurrentModificationException(ise); } action.accept(k, v); } }
共同lambda表达式一起利用,操纵起来越发利便。
2.1 利用Java8的foreach+lambda表达式遍历Map
Map<String, Integer> items = new HashMap<>(); items.put("A", 10); items.put("B", 20); items.put("C", 30); items.put("D", 40); items.put("E", 50); items.put("F", 60); items.forEach((k,v)->System.out.println("Item : " + k + " Count : " + v)); items.forEach((k,v)->{ System.out.println("Item : " + k + " Count : " + v); if("E".equals(k)){ System.out.println("Hello E"); } });
Reference: