怎么写一个es6的map遍历方法

怎么写一个es6的map遍历方法,第1张

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遍历方法更优等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9458397.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存