Java荟萃篇:Map常用调用方式以及配置对比版权声明
原创一、Map集合的常见遍历方法:
遍历Map有三种常见的收集方式:使用keySet使用方法entrySet使用方法values()获取值的方法,其中有相应的值for循环遍历和Iterator遍历方法的值。
具体用法如下:
public class MapTest {
public static void main(String[] args) {
HashMap<Integer,String> map= new HashMap<Integer,String>();
for(int i = 0;i < 1000000;i++){
map.put(i, "第"+i+"个元素");
}
//第一种方式:keySet的for循环遍历方法
long time1 = System.nanoTime();
for(Integer key : map.keySet()){
map.get(key);
}
long time2 = System.nanoTime();
//第一种方式:keySet的Iterator遍历方式
Iterator
while(iterator.hasNext()){
Integer key = iterator.next();
map.get(key);
}
long time3 = System.nanoTime();
//第二种方式:entrySet的for循环遍历方法
for(Entry<Integer,String> entry: map.entrySet()){
entry.getKey();
entry.getValue();
}
long time4 = System.nanoTime();
//第二种方式:entrySet的Iterator遍历方式
Iterator<Entry<Integer, String>> iterator2 = map.entrySet().iterator();
Entry<Integer, String> entry;
while(iterator2.hasNext()){
entry = iterator2.next();
entry.getKey();
entry.getValue();
}
long time5 = System.nanoTime();
//第三种方式:只能得到value,可以用values()全部返回value的Collection
//values()方法的for循环遍历方法
Collection
for(String value : values){
}
long time6 = System.nanoTime();
//values()方法的Iterator遍历方式
Iterator
String value;
while(iterator3.hasNext()){
value=iterator3.next();
}
long time7 = System.nanoTime();
System.out.println("keySet的for循环遍历方法耗时:" + (time2-time1)/1000 + "微秒");
System.out.println("keySet的Iterator耗时的遍历模式:" + (time3-time2)/1000 + "微秒");
System.out.println("entrySet的for循环遍历方法耗时:" + (time4-time3)/1000 + "微秒");
System.out.println("entrySet的Iterator耗时的遍历模式:" + (time5-time4)/1000 + "微秒");
System.out.println("values()方法的for循环遍历方法耗时:" + (time6-time5)/1000 + "微秒");
System.out.println("values()方法的Iterator耗时的遍历模式:" + (time7-time6)/1000 + "微秒");
}
}
keySet是密钥的集合,Set里面的类型是key的类型;
entrySet是键-值对的集合,Set里面的类型是Map.Entry,Entry是一个键-值对;
keySet():迭代后,只能通过get()取key;
entrySet():迭代后,您可以e.getKey(),e.getValue()取key和value回报是Entry接口;
2的性能比较。遍历:
上一代码的输出如下:
keySet的for循环遍历方法耗时:41822微秒
keySet的Iterator耗时的遍历模式:36073微秒
entrySet的for循环遍历方法耗时:31792微秒
entrySet的Iterator耗时的遍历模式:25888微秒
values()方法的for循环遍历方法耗时:25264微秒
values()方法的Iterator耗时的遍历模式:21215微秒
从上面的输出中可以看到:
1当数据元素的数量大时,entrySet()该方法的遍历效率更快keySet()有两个原因 :
(1)一个原因是keySet相当于横移2时间,一次是正确的key的Set集合的遍历,第二个是每个遍历过程都必须通过。key和map.get(key)来获取value值。
(2)第二个原因是map.get(key)当时,底层基于key的hashCode该值被散列以获得hash值,然后将其作为索引映射到对应的table数组的索引位置,这是一个密集的计算,而且开销很大。CPU,如果有大量的元素,它会产生。CPU使用率飙升,影响响应速度,同时entrySet()返回的set里面的元素是Map.Enpty类型,key和value是此类的属性,entry.getKey()和entry.getValue()效率当然很高。
2然而当数据元素的数量相对较少时,keySet()该方法的遍历效率更快entrySet()。
3、values()是返回Map的所有value的集合的Collection,只能遍历value,很难穿越key,所以通常不会,如果我们只需要获得value值,使用values更有效地移动。
4通过以上几种方式。for循环遍历和Iterator遍历需要时间。因此Iterator遍历将更有效for循环效率稍快。
作者:a745233700
来源:CSDN
原文:https://blog.csdn.net/a745233700/article/details/83025222
版权声明:本文为博主原创文章,转载请附上博客链接!
版权声明
所有资源都来源于爬虫采集,如有侵权请联系我们,我们将立即删除