HashMap源码(10)forEach、replaceAll
文章目录
jdk8新方法forEach更好的遍历map数组进行操作了。
现在先看看以前的遍历写法:
以前总结的:
String key = null;
String value = null;
for(Map.Entry<String,String> entry:map.entrySet()){
key = entry.getKey();
value = entry.getValue();
System.out.println("key;"+ key+",value:"+value);
}
for(String key: map.keySet()){
System.out.println("key:"+key);
}
for(String value:map.values()){
System.out.println("value"+value);
}
这个进行遍历的方法将key和 value两个值分开了。
还有常用的是使用Iterator进行遍历: 1. 使用范式
Iterator<Map.Entry<String,String>> iterator = map.entrySet().iterator();
while (iterator.hasNext()){
Map.Entry<String,String> entry = iterator.next();
System.out.println("key:"+entry.getKey()+",value:"+entry.getValue());
}
- 不适用范式
Iterator entries = map.entrySet().iterator(); while (entries.hasNext()){ Map.Entry entry = (Map.Entry)entries.next(); String key = (String)entry.getKey(); String value = (String)entry.getValue(); System.out.println("key:"+entry.getKey()+",value:"+entry.getValue()); }
该种方式看起来冗余却有其优点所在。首先,在老版本java中这是惟一遍历map的方式。另一个好处是,你可以在遍历时调用iterator.remove()来删除entries,另两个方法则不能。根据javadoc的说明,如果在for-each遍历中尝试使用此方法,结果是不可预测的。
jdk8的forEach方法:
map.forEach((k,v)->sout(k,v));
static void sout(String k,String v){
System.out.println("forEach key:"+k);
System.out.println("forEach value"+ v);
}
改方法直接在定义一个处理key和value的方法就可以了,方便不用特意用之前的方法。方便了很多
源码:
@Override
public void forEach(BiConsumer<? super K, ? super 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.key, e.value);
}
if (modCount != mc)
throw new ConcurrentModificationException();
}
}
replaceAll()方法也是遍历整个map对value进行操作改变:
@Override
public void replaceAll(BiFunction<? super K, ? super V, ? extends V> function) {
Node<K,V>[] tab;
if (function == 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) {
e.value = function.apply(e.key, e.value);
}
}
if (modCount != mc)
throw new ConcurrentModificationException();
}
}
map.replaceAll((k,v)->replaceA(k,v));
static String replaceA(String k,String v){
// if(k.equals("k"))
v=v+"value +123";
return v;
}
结果:
{j=xue yivalue +123, k=kejivalue +123}