`
changjw
  • 浏览: 730 次
  • 性别: Icon_minigender_1
  • 来自: 天津
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

keySet()与entrySet()的比较

阅读更多

import java.util.Calendar;   
import java.util.Date;   
import java.util.HashMap;   
import java.util.Iterator;   
import java.util.Map.Entry;   
  
/**
* 测试keySet()与entrySet()的迭代时间
* keySet():迭代后只能通过get()取key
* entrySet():迭代后可以e.getKey(),e.getValue()取key和value。返回的是Entry接口
* 最后说明下keySet()的速度比entrySet()慢了很多。看来以后要考虑用entrySet()了
* @author YL
* @date 2009.6.10
*/  
public class HashMapTest       
{   
    public static void main(String[] args)   
     {   
         HashMap<String,String> kmap = new HashMap<String,String>();   
         HashMap<String, String> emap = new HashMap<String, String>();   
           
        //装数据   
        for (int i = 0; i < 1000; i++)   
         {   
             kmap.put(""+i, "YL");   
         }   
        for (int i = 0; i < 1000; i++)   
         {   
             emap.put(""+i, "ZT");   
         }   
           
        long stimes = System.currentTimeMillis();   
        long ctimes = Calendar.getInstance().getTimeInMillis();   
        long dtimes = new Date().getTime();   
           
        //初始时间 这里我用了三种取值方式 最后发现System.currentTimeMillis();是最直接的取值方法   
         System.out.println(stimes+" "+ctimes+"   "+dtimes);   
           
         Iterator<String> ktor = kmap.keySet().iterator();   
        while(ktor.hasNext())   
         {   
             System.out.println(ktor.next());   
         }   
           
        long stimes1 = System.currentTimeMillis();   
        long ctimes1 = Calendar.getInstance().getTimeInMillis();   
        long dtimes1 = new Date().getTime();   
           
        //结束世界并且也是entrySet的开始时间   
         System.out.println((stimes1-stimes)+"    "+(ctimes1-ctimes)+"     "+(dtimes1-dtimes));   
         System.out.println(stimes1+"     "+ctimes1+" "+dtimes1);   
           
         Iterator<Entry<String, String>> itor = emap.entrySet().iterator();   
        while(itor.hasNext())   
         {   
             Entry<String, String> e = itor.next();   
            //System.out.println(e.getKey());   
             System.out.println(e.getValue());   
         }   
           
        long stimes2 = System.currentTimeMillis();   
        long ctimes2 = Calendar.getInstance().getTimeInMillis();   
        long dtimes2 = new Date().getTime();   
         System.out.println(stimes2+"     "+ctimes2+" "+dtimes2);   
         System.out.println((stimes2-stimes1)+"   "+(ctimes2-ctimes1)+"    "+(dtimes2-dtimes1));   
     }   
}  

---------------------------------------------------------------------------------------------------------------------------------

Map的keySet方法
2008-07-12 10:44
有一个Map对象,这时候使用keySet()方法获取所有的key值,比如:
  
Map map = new HashMap();
   map.put(1, "a");
   map.put(2, "b");
   map.put(3, "c");
   map.put(4, "d");
   Set keys1 = map.keySet();
   Set keys2 = map.keySet();
   Set keys3 = map.keySet();

上面三个set对象key1,key2,key3引用的是一个对象。这是map的keySet()方法只返回一个set实例,所以当从key1中删除一个对象时候,key2和key3将会受到影响。
  
keys1.remove(1);
   System.out.println(keys1);
   System.out.println(keys2);
   System.out.println(keys3);

打印结果为:
[2, 4, 3]
[2, 4, 3]
[2, 4, 3]


下面是摘自API帮助文档的说明

keySet
public Set<K> keySet()返回此映射中所包含的键的 set 视图。该集合受映射的支持,所以映射的变化也反映在该集合中,反之亦然。该集合支持元素的移除,通过 Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作,从该映射中移除相应的映射关系。它不支持 add 或 addAll 操作。

指定者:
接口 Map<K,V> 中的 keySet
覆盖:
类 AbstractMap<K,V> 中的 keySet
返回:
此映射所包含的键的 set 视图。



Map使用注意
Hatter Jiang 12 11th, 2007                 
今天的程序出现异常“java.util.ConcurrentModificationException”,但非常奇怪因为在多线程之间都做了同步,为什么还会有这样的错误呢?突然发现类似如下代码:
 
 Set<String> keySet = map.keySet();
  for (String key : keySet) {
      // some codes ...
      map.remove(key);
  }

这段代码怎么看都比较可疑,于是写了如下代码:
  
Map<String, Object> map = new HashMap<String, Object>();
  map.put("key1", "value1");
  map.put("key2", "value2");
  map.put("key3", "value3");
  Set<String> keySet = map.keySet();
  for (String key : keySet) {
      // some codes ...
      map.remove(key);
  }

果然一运行就出现上面的异常,原来是因为删除了一个Entry之后,因为ketSet不正确,在for循环时出的问题。改成下面的代码问题解决:
 
 Map<String, Object> map = new HashMap<String, Object>();
  map.put("key1", "value1");
  map.put("key2", "value2");
  map.put("key3", "value3");
  String[] keySet = map.keySet().toArray(new String[0]);
  for (String key : keySet) {
      // some codes ...
      map.remove(key);
  }

正如上面的代码,因为加了toArray所以新的集合和原来的keySet就没有了关系,所以也不会出错了。类似于这样的代码大家都要注意啊,嘿嘿。
来自: http://hi.baidu.com/tiankui6658/blog/item/b7a6b9fd6035de4fd6887dcd.html
分享到:
评论

相关推荐

    集合嵌套集合并用迭代器输出,有关keySet()和entrySet()的练习

    与`keySet()`相比,`entrySet()`提供了更全面的访问Map内容的方式,因为一次操作就能同时访问键和值。 在集合的嵌套合并中,我们可能需要将多个Map或其他集合类型的对象合并成一个大的集合。例如,如果我们有两个...

    Java Map遍历方式的选择

    然而,如果Map实现得足够优化,keySet的性能可能会与entrySet相当,甚至在某些情况下优于entrySet。 遍历key或value时,关键在于是否需要同时访问键和值。如果只需要遍历键或值,values方法和keySet的性能可能会...

    java map集合

    Map接口定义了许多方法,如put()用于添加键值对,get()用于根据键查找对应的值,remove()用于删除键值对,size()返回Map中元素的数量,keySet()和values()分别返回键集和值集,entrySet()返回所有键值对的集合。...

    数据结构与算法1

    Map是存储键值对的数据结构,提供了keySet()和entrySet()两个方法来遍历其内容。 1. Map对象中的keySet()和entrySet()的区别在于它们返回的集合类型以及遍历方式。keySet()返回一个只包含键(Key)的Set集合,集合...

    HashMap遍历

    与`keySet()`不同的是,`entrySet()`允许我们同时访问键和值,而无需额外的`get()`操作。这在性能上通常更优,尤其是在频繁访问键值对的场景下。下面是一个使用`entrySet()`遍历`HashMap`的示例: ```java Map, ...

    如何得到hashmap的索引

    根据提供的内容,我们可以了解到遍历`HashMap`主要有两种方式:使用`keySet()`方法和使用`entrySet()`方法。 1. **使用keySet()方法** ```java Map map = new HashMap(); Iterator iter = map.keySet()....

    JAVA遍历Map所有元素.doc

    JAVA遍历Map所有元素 ...我们可以使用entrySet()方法或keySet()方法来实现遍历,但是entrySet()方法的效率远远高于keySet()方法。因此,在实际开发中,我们应该尽量使用entrySet()方法来遍历Map中的所有元素。

    JAVA遍历map的几种实现方法代码

    - 对于TreeMap,由于其内部实现基于红黑树,查询value的开销较大,所以推荐使用entrySet进行遍历,它的性能远超keySet。 总结来说,选择遍历Map的方法应根据实际需求来决定: - 只遍历键:使用`keySet()`。 - 只...

    java遍历Map对象的说有数据

    我们将重点讨论通过`entrySet()`方法和`keySet()`方法来实现遍历的过程。 #### 方法一:使用`entrySet()` `entrySet()`方法返回一个包含映射中的所有映射关系的`Set`视图。这使得我们可以迭代整个映射,同时访问每...

    JAVA笔试题目下载

    - **Map**:HashMap、TreeMap、WeakHashMap等的区别与使用,以及KeySet、EntrySet和Values的使用。 - **泛型**:理解泛型的作用,掌握通配符的使用。 3. **多线程**: - **线程的创建**:通过Thread类和Runnable...

    Java集合Collection、List、Set、Map使用详解

    - 对于Map,可以对keySet或entrySet进行排序,然后通过key或entry进行操作。 总结,Java集合框架提供了多种数据结构,以适应不同的需求。理解并熟练运用这些集合,可以帮助我们编写出更高效、更易于维护的代码。在...

    另一种遍历Map的方式

    今天,我们来讨论一种遍历Map的方式,即使用Map.Entry和Map.entrySet()。 Map.Entry是什么? ---------------- Map.Entry是一个接口,表示一个映射项,里面有Key和Value。它有两个方法:getKey()和getValue(),...

    java中Map的两种遍历方法

    本文将详细探讨在Java中遍历`Map`的两种常用方法:通过`keySet()`方法和通过`entrySet()`方法。 ### 一、通过`keySet()`方法遍历`Map` #### 方法概述 `keySet()`方法返回一个包含`Map`中所有键的`Set`视图。通过...

    Map集合的遍历.md

    1. **步骤1**:通过`keySet()`或`entrySet()`方法获取键的集合或键值对的集合。 2. **步骤2**:使用增强for循环遍历集合。 3. **步骤3**:通过循环中的元素获取键和值,并打印出键值对。 #### 四、总结 本文介绍了...

    Java Map 遍历比较齐全的解析.docx

    这是最基础的遍历方式,通过获取`Map`的`keySet`,然后用增强型for循环遍历`keySet`,再通过`get()`方法获取对应的`value`。 ```java for (Integer in : map.keySet()) { String str = map.get(in); System.out...

    java遍历大容量map的正确方法.pdf

    这种方式与第二种相似,也是遍历entrySet,但使用了Java 5引入的foreach循环,使得代码更加简洁。 ```java for (Map.Entry, String&gt; entry : map.entrySet()) { System.out.println("key= " + entry.getKey() + ...

    java Map 遍历方法

    与遍历`entrySet()`类似,也可以使用增强型for循环遍历`keySet()`。 ```java for (String key : emails.keySet()) { System.out.println("email-" + key + ":" + emails.get(key)); } ``` #### 二、遍历Map...

    Java HashMap三种循环遍历方式及其性能对比实例分析

    HashMap提供了三种循环遍历方式,即for each map.entrySet()、显示调用map.entrySet()的集合迭代器、for each map.keySet()。每种遍历方式都有其特点和优缺势,本文将通过实例分析和性能测试来比较这三种遍历方式的...

Global site tag (gtag.js) - Google Analytics