Set<Entry<String,String>>entrySet=map.entrySet();
Set<String>set=map.keySet();`
上面就是我们经常用Map进行遍历的两种方式,在此对比一下两者的区别
在此我们看一下源码解析:
keySet:get方式和getEntry方式的比较
public V get(Object key) {
if (key == null)
return getForNullKey();
Entry<K,V> entry = getEntry(key);
return null == entry ? null : entry.getValue();
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
final Entry<K,V> getEntry(Object key) { if (size == 0) { return null; } int hash = (key == null) ? 0 : hash(key); for (Entry<K,V> e = table[indexFor(hash, table.length)]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) return e; } return null; }
从上面两个方式的可以看出
使用entrySet遍历Map类集合KV,而不是keySet方式进行遍历。
说明:keySet其实是遍历了2次,一次是转为Iterator对象,另一次是从hashMap中取出 key所对应的value。而entrySet只是遍历了一次就把key和value都放到了entry中,效率更高。如果是JDK8,使用Map.foreach方法。
正例:values()返回的是V值集合,是一个list集合对象;keySet()返回的是K值集合,是一个Set集合对象;entrySet()返回的是K-V值组合集合。
例子:第一种
Set<Entry<String,String>>entrySet=map.entrySet();Set<String>set=map.keySet();`
Map map = new HashMap();
Iterator iter = map.entrySet().iterator();
while (iter.hasNext()) {
Map.Entry entry = (Map.Entry) iter.next();
Object key = entry.getKey();
Object val = entry.getValue();
}
效率高,以后一定要使用此种方式!
例子:第二种
Map map = new HashMap();
Iterator iter = map.keySet().iterator();
while (iter.hasNext()) {
Object key = iter.next();
Object val = map.get(key);
}
效率低,以后尽量少使用!
Tips:对于两种遍历方式我们构造代码的时候一定要注意,一定要写出高质量的代码是我们毕生追求,写出艺术感,使命感,下面想说一下阿里Java开发手册的注意Map类集合K/V能不能存储null值的情况,如下表格:
集合类 |
Key |
Value |
Super |
说明 |
Hashtable |
不允许为null |
不允许为null |
Dictionary |
线程安全 |
ConcurrentHashMap |
不允许为null |
不允许为null |
AbstractMap |
锁分段技术(JDK8:CAS) |
TreeMap |
不允许为null |
允许为null |
AbstractMap |
线程不安全 |
HashMap |
允许为null |
允许为null |
AbstractMap |
线程不安全 |