哪种Map遍历方法更优

哪种Map遍历方法更优,第1张

我们都知道遍历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()方法。

标签的语法定义如下所示。

body

content

用这个例子讲解:

${item}

1)生成arraylist,

2)将list储存至request的属性范围中

3)用遍历,最后使用将item的内容显示出来。

JDK 中

view plaincopy to clipboardprint    <FONT color=# ff>Map map = new HashMap();

Iterator it = map entrySet(erator();

while (it hasNext()) {

Map Entry entry = (Map Entry) it next();

Object key = entry getKey();

Object value = entry getValue();

}</FONT>

Map map = new HashMap();

Iterator it = map entrySet(erator();

while (it hasNext()) {

Map Entry entry = (Map Entry) it next();

Object key = entry getKey();

Object value = entry getValue();

}JDK 中 应用新特性For Each循环

view plaincopy to clipboardprint    Map m = new HashMap();

for(Object o : map keySet()){

map get(o);

}

Map m = new HashMap();

for(Object o : map keySet()){

map get(o);

}返回的 set 中的每个元素都是一个 Map Entry 类型

view plaincopy to clipboardprint    <FONT color=# ff>private Hashtable<String String> emails = new Hashtable<String String>();</FONT>

private Hashtable<String String> emails = new Hashtable<String String>();  另外 我们可以先把hashMap 转为集合Collection 再迭代输出 不过得到的对象

view plaincopy to clipboardprint     <FONT color=# ff>//方法一: 用entrySet()

Iterator it = emails entrySet(erator();

while(it hasNext()){

Map Entry m=(Map Entry)it next();

( email + m getKey() + : + m getValue());

}

// 方法二 jdk 支持 用entrySet()和For Each循环()

for (Map Entry<String String> m : emails entrySet()) {

( email + m getKey() + : + m getValue());

}

// 方法三 用keySet()

Iterator it = emails keySet(erator();

while (it hasNext()){

String key;

key=(String)it next();

( email + key + : + emails get(key));

}

// 方法五 jdk 支持 用keySEt()和For Each循环

for(Object m: emails keySet()){

( email + m+ : + emails get(m));

}    </FONT>

//方法一: 用entrySet()

Iterator it = emails entrySet(erator();

while(it hasNext()){

Map Entry m=(Map Entry)it next();

( email + m getKey() + : + m getValue());

}

// 方法二 jdk 支持 用entrySet()和For Each循环()

for (Map Entry<String String> m : emails entrySet()) {

( email + m getKey() + : + m getValue());

}

// 方法三 用keySet()

Iterator it = emails keySet(erator();

while (it hasNext()){

String key;

key=(String)it next();

( email + key + : + emails get(key));

}

// 方法五 jdk 支持 用keySEt()和For Each循环

for(Object m: emails keySet()){

( email + m+ : + emails get(m));

}

Map    aa    =    new    HashMap();      aa put( tmp     new    Object());      //追加      替换用同样的函数       aa remove( temp );                        //删除      for    (Iterator    i    =    aa values(erator();    i hasNext();    )    {              Object    temp    =    i next();      }          //遍历    来个完整的 包含TreeSet的元素内部排序的

view plaincopy to clipboardprint    public static void main(String[] args) {

ArrayList<String> list = new ArrayList<String>();

HashMap<Object Object> hash = new HashMap<Object Object>();

TreeMap<Object Object> treeMap = new TreeMap<Object Object>();

list add( a );

list add( b );

list add( c );

hash put( );

hash put( );

hash put( );

hash put( );

hash put( );

hash put( );

treeMap put( );

treeMap put( );

treeMap put( );

treeMap put( );

treeMap put( );

treeMap put( );

//list遍历

for(String m: list){

System out println(m);

}

// hashmap entrySet() 遍历

for(Map Entry<Object Object> m: hash entrySet()){

System out println(m getKey()+ +m getValue());

}

//hashmap keySet() 遍历

for(Object m: hash keySet()){

System out println(m+ +hash get(m));

}

// treemap keySet()遍历

for(Object m: treeMap keySet()){

System out println(m+ +treeMap get(m));

}

lishixinzhi/Article/program/Java/hx/201311/25783

将后端数据库的某个表连同其结构数据和数据重新分别导入所有的前端ACCESS数据库后再删除后端数据库那个表就好了。当然最快捷的方法是只对一个前端这么做然后再分发那个前端给各个终端用户。 记得导回后端表前先删除前端数据库对后端数据库那张表的链接(链接表)。

  th:each 属性支持的迭代类型有很多,最常见的就是数组、List、Set 和 Map,其中数组、List、Set 的迭代方法类似,而迭代 Map 时,会得到一个 javautilMapEntry 对象。

Java后台生成一个 Map 对象,传到前台

Thymeleaf 遍历 map 集合,取出来的是一个 Entry,可以直接调用 Entry 的 key 或者 value 来取得键值。

以上就是关于哪种Map遍历方法更优全部的内容,包括:哪种Map遍历方法更优、请问如何在<c:forEach 标签中遍历map集合、Java中怎样遍历Map的所有的元素等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存