Map集合遍历(详解)

10 篇文章 0 订阅
3 篇文章 0 订阅

如何初始化一个map:
示例:
public class TestMap {
  public static Map<Integer, Integer> map = new HashMap<Integer, Integer>();
}

keySet values
如果只需要map的key或者value,用map的keySet或values方法无疑是最方便的
  // KeySet 获取key
  public void testKeySet() {
    for (Integer key : map.keySet()) {
      System.out.println(key);
    }
  }
  // values 获取value
  public void testValues() {
    for (Integer value : map.values()) {
      System.out.println(value);
    }
  }
keySet get(key)

如果需要同时获取key和value,可以先获取key,然后再通过map的get(key)获取value
  // keySet get(key) 获取key and value
  public void testKeySetAndGetKey() {
    for (Integer key : map.keySet()) {
      System.out.println(key + ":" + map.get(key));
    }
  }

entrySet
通过对map entrySet的遍历,也可以同时拿到key和value,一般情况下,性能上要优于上一种,这一种也是最常用的遍历方法
  // entrySet 获取key and value
  public void testEntry() {
    for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
      System.out.println(entry.getKey() + ":" + entry.getValue());
    }
  }

Iterator
对于上面的几种foreach都可以用Iterator代替,其实foreach在java5中才被支持,foreach的写法看起来更简洁
但Iterator也有其优势:在用foreach遍历map时,如果改变其大小,会报错,但如果只是删除元素,可以使用Iterator的remove方法删除元素
  // Iterator entrySet 获取key and value
  public void testIterator() {
    Iterator<Map.Entry<Integer, Integer>> it = map.entrySet().iterator();
    while (it.hasNext()) {
      Map.Entry<Integer, Integer> entry = it.next();
      System.out.println(entry.getKey() + ":" + entry.getValue());
      // it.remove(); 删除元素
    }
  }

Lambda
java8提供了Lambda表达式支持,语法看起来更简洁,可以同时拿到key和value,不过,经测试,性能低于entrySet,所以更推荐用entrySet的方式
  // Lambda 获取key and value
  public void testLambda() {
    map.forEach((key, value) -> {
      System.out.println(key + ":" + value);
    });
  }

简单性能测试

用10万条数据,做了一个简单性能测试,数据类型为Integer,map实现选取HashMap

  static {
    for (int i = 0; i < 100000; i++) {
      map.put(i, 1);
    }
  }

测试结果如下:

KeySet:           392
Values:           320
keySet get(key):  552
entrySet:         465
entrySet Iterator:508
Lambda:           536

需要说明的是,map存储的数据类型,map的大小,以及map的不同实现方式都会影响遍历的性能,所以该测试结果仅供参考
总结

如果只是获取key,或者value,推荐使用keySet或者values方式
如果同时需要key和value推荐使用entrySet
如果需要在遍历过程中删除元素推荐使用Iterator
如果需要在遍历过程中增加元素,可以新建一个临时map存放新增的元素,等遍历完毕,再把临时map放到原来的map中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C语言中的map是一个键值对的集合容器,可以用来存储一些相关数据。它的定义类似于一个结构体,使用时要先定义一个map类型的变量,然后再添加键值对。 定义map类型变量的方式为: ``` map<key_type, value_type> my_map; ``` 其中,key_type和value_type分别是键和值的类型,可以是任意类型的数据。在使用map之前,需要先包含头文件<map.h>。 接下来,可以通过以下代码向map中添加键值对: ``` my_map[key] = value; ``` 其中,key为要添加的键,value为要添加的值。如果键已经存在,则会更新该键的值。 可以通过以下方式访问map中的值: ``` my_map[key] ``` 这里的key为所要访问的键。如果该键存在,则返回其对应的值,否则返回默认值(通常为0或空)。 还可以使用以下代码来遍历所有的键值对: ``` for (auto it = my_map.begin(); it != my_map.end(); ++it) { auto key = it->first; auto value = it->second; // TODO:对键值对进行操作 } ``` 其中,auto关键字可以自动推断变量类型,it->first用于获取当前键值对的键,it->second用于获取当前键值对的值。 除了上述常用的操作,还有一些其他的操作,如: - erase(key):用于删除指定键的键值对; - count(key):返回指定键出现的次数(通常是0或1); - empty():判断map是否为空; - size():返回map中键值对的数目。 总的来说,C语言中map的使用十分灵活,能够方便地存储和操作多个键值对。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值