1、遍历MapentrySet():它的每一个元素都是MapEntry对象,这个对象中,
放着的就是Map中的某一对key-value;
2、遍历MapkeySet():它是Map中key值的集合,我们可以通过遍历这个集合来
读取Map中的元素;
3、遍历Mapvalues():它是Map中value的集合,我们可以直接通过这个集合遍历
Map中的值,却不能读取key。
package netnietest; import javautilHashMap; import javautilIterator; import javautilMap; public class HashMapTest { private static Map<Integer, String> map=new HashMap<Integer,String>(); / 1HashMap 类映射不保证顺序;某些映射可明确保证其顺序: TreeMap 类 2在遍历Map过程中,不能用mapput(key,newVal),mapremove(key)来修改和删除元素, 会引发 并发修改异常,可以通过迭代器的remove(): 从迭代器指向的 collection 中移除当前迭代元素 来达到删除访问中的元素的目的。 / public static void main(String[] args) { mapput(1,"one"); mapput(2,"two"); mapput(3,"three"); mapput(4,"four"); mapput(5,"five"); mapput(6,"six"); mapput(7,"seven"); mapput(8,"eight"); mapput(5,"five"); mapput(9,"nine"); mapput(10,"ten"); Iterator<MapEntry<Integer, String>> it = mapentrySet()iterator(); while(ithasNext()){ MapEntry<Integer, String> entry=itnext(); int key=entrygetKey(); if(key%2==1){ Systemoutprintln("delete this: "+key+" = "+key); //mapput(key, "奇数"); //ConcurrentModificationException //mapremove(key); //ConcurrentModificationException itremove(); //OK } } //遍历当前的map;这种新的for循环无法修改map内容,因为不通过迭代器。 Systemoutprintln("-------nt最终的map的元素遍历:"); for(MapEntry<Integer, String> entry:mapentrySet()){ int k=entrygetKey(); String v=entrygetValue(); Systemoutprintln(k+" = "+v); } } }
我们都知道遍历Map一般有3种方法,values(),keySet()和entrySet(),
常见的是keySet用的多,简单容易理解,entrySet()是返回Map中的静态内部类Entry类类型的Set实例,当然了你别说forEach,forEach只是一种代替for(inti=0;;)和while()遍历的一种方式,底层也是用迭代器实现的,只不过把部分东西隐藏了,建议大家平常开发中能用forEach遍历,尽可能的用这个,《Effectivejava》中也明确表示了,简单而不容易出错。
如果Map中有大量的元素,而且并发量又很高,这就涉及到采用哪种遍历方法的问题,下面就来测试一下:
Map<String,String> mapTest=new HashMap<String,String>();for(int i=0;i<10000;i++){
mapTestput(StringvalueOf(i),StringvalueOf(i) );
}
//一种遍历,keySet()方法
long start=SystemnanoTime();Set<String> setEach=mapTestkeySet();
for(String key:setEach){
String value=mapTestget(key);
}
long end=SystemnanoTime();
Systemoutprintln("keySet遍历map耗时"+(end-start)/1000+"微秒");
//二种遍历,可用values()返回Collection<T>,不容易得到对应的key
start=SystemnanoTime();Collection<String> co=mapTestvalues();
for(String value:co){
//遍历中也在创建value
}
end=SystemnanoTime();
Systemoutprintln("values遍历map(只得到值)耗时"+(end-start)/1000+"微秒");
//三种遍历,用entrySet()方法返回Set<MapEntry<T,T>>类型,再获取里边的MapEntry
start=SystemnanoTime();
Set<MapEntry<String,String>> entrySet=mapTestentrySet();
for(MapEntry<String, String> entry:entrySet){
String key=entrygetKey();
String value=entrygetValue();
}
end=SystemnanoTime();
Systemoutprintln("entrySet遍历map耗时"+(end-start)/1000+"微秒");
经过多次运行,结果大概都是这样的:
keySet遍历map耗时9867微秒
values遍历map(只得到值)耗时2539微秒
entrySet遍历map耗时2783微秒
values()是返回Map的所有value的集合collection,只能遍历到值,很难遍历到key所以一般不用,除非在某种特殊场合,所以一般采用的第一种和第三种方式。而测试表明entrySet()方式遍历效率更高。
entrySet()方式遍历之所以快于keySet(),一个原因是keySet相当与遍历了2次,
一次是对key的Set集合的遍历,二次是每次遍历过程都要通过key和mapget(key)来获取value值。
第二个原因是mapget(key)获取的时候,底层其实根据key的hashcode值经过哈希算法得到一个hash值然后作为索引映射到对应table数组的索引位置,这是一次密集型计算,很耗费CPU,如果有大量的元素,则会使CPU使用率飙升,影响响应速度,而entrySet()返回的set里边元素都是MapEntry类型,key和value就是这个类的一个属性,entrygetKey()和entrygetValue()效率肯定很高。
所以平常开发过程中,如果对Map讲究效率的遍历的话,还是采用entrySet()方法。
以上就是关于怎么写一个es6的map遍历方法全部的内容,包括:怎么写一个es6的map遍历方法、java如何遍历map的所有的元素、哪种Map遍历方法更优等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)