1、遍历

java遍历Map的方式有多种,一下以代码示例来说明使用:

        Map<String, String> tmap = new HashMap<String, String>(5);

        tmap.put("a", "aa");
tmap.put("b", "bb");
tmap.put("c", "cc");
tmap.put("d", "dd");
tmap.put("e", "ee"); //常用方式
System.out.println("************ 1 entrySet ************");
for (Map.Entry<String, String> map : tmap.entrySet()) {
String key = map.getKey();
String value = map.getValue();
System.out.println(key + ":" + value);
} System.out.println("************ 2 iterator ************");
Iterator<Map.Entry<String, String>> iterator = tmap.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> next = iterator.next();
System.out.println(next.getKey() + ":" + next.getValue());
} //只需要map中的键或者值,可以通过keySet或values来实现遍历
System.out.println("************ 3 keySet 通过键找值遍历(效率低)************");
Set<String> keySet = tmap.keySet();
for (String key : keySet) {
String value = tmap.get(key);
System.out.println(key + ":" + value);
} System.out.println("************ 4 values ************");
Collection<String> values = tmap.values();
for (String value : values) {
System.out.println(value);
} //java8
System.out.println("************ 5 java8 forEach ************");
tmap.forEach((key, value) ->
System.out.println(key + ":" + value)
);

2、常用Map

2.1  常用Map有HashMap、LinkedHashMap、TreeMap三种:

HashMap是常规的哈希表,查询以及插入的性能最好,在使用中用的较多,因为HashMap是线程不安全的,所以多线程中不好使用。

LinkedHashMap可以指定遍历顺序或者按最近最少使用的顺序,它实现上继承了HashMap,只是比HashMap多维护了一个双链表,故查询及插入性能稍差于HashMap,遍历性能要好于HashMap。在按照元素添加顺序遍历,可以选择使用LinkedHashMap。示例:

        System.out.println("*******LinkedHashMap*******");
//第三个参数设置true,表示按照访问顺序排序。每次访问一个元素(get或put),被访问的元素都被放到最后。
LinkedHashMap linkedHashMap = new LinkedHashMap(16, 0.75f, true);
linkedHashMap.put("1", "1");
linkedHashMap.put("2", "2");
linkedHashMap.put("3", "3");
loopLinkedHashMap(linkedHashMap);
linkedHashMap.get("1");
loopLinkedHashMap(linkedHashMap);
linkedHashMap.put("4", "4");
loopLinkedHashMap(linkedHashMap);
linkedHashMap.get("3");
loopLinkedHashMap(linkedHashMap);
linkedHashMap.put("5", "5");
loopLinkedHashMap(linkedHashMap);
linkedHashMap.get("2");
loopLinkedHashMap(linkedHashMap);

TreeMap是有序的,它将元素存储在一个红黑树中,存储在它里面的Key必须实现Comparable接口,key是从小到大排好序的。各项性能上相比HashMap来说较差。在需要存储元素需要有序时,可以选择TreeMap。

2.2 同步 Map

2.2.1 使用 Collections.synchronizedMap() 将未同步的 Map 转换为同步的 Map。例:

HashMap<Integer,String> hashMap = new HashMap<>();
Map<Integer,String> synchronizedMap = Collections.synchronizedMap(hashMap);

2.2.2 ConcurrentReaderHashMap 和 ConcurrentHashMap。

这些 Map 实现是线程安全的,并且不需要对并发访问或更新进行同步,同时还适用于大多数需要 Map 的情况。它们还远比同步的 Map(如 Hashtable)或使用同步的包装器更具伸缩性,并且与 HashMap 相比,它们对性能的破坏很小。util.concurrent 程序包构成了 JSR166 的基础;JSR166 已经开发了一个包含在 Java 1.5 版中的并发实用程序,而 Java 1.5 版将把这些 Map 包含在一个新的 java.util.concurrent 程序包中。

ConcurrentHashMap<Integer,String> concurrentHashMap = new ConcurrentHashMap<>();

示例代码Github

 

最新文章

  1. Mini ORM——PetaPoco笔记
  2. Java 标识符、数据类型、运算符
  3. nios II--实验3——led 100M硬件部分
  4. 字符集与编码01--charset vs encoding
  5. asp.net权限控制配置web.config
  6. php截取字符串
  7. EF执行存储过程
  8. [ZOJ 1005] Jugs (dfs倒水问题)
  9. 130701基础练习-first
  10. 【转载】socket的半包,粘包与分包的问题
  11. Java开发心得
  12. 盒子游戏(The Seventh Hunan Collegiate Programming Contest)
  13. Mybatis源码分析-StatementHandler
  14. .net 和 core2.0 数据库连接字符串
  15. Error:Error converting bytecode to dex: Cause: com.android.dex.DexException: Multiple dex files define Lcom/google/android/gms/internal/adp;
  16. sublime text3 插件的安装
  17. 一个页面从输入url到加载完成的过程都发生了什么,请详细说明
  18. 恋爱Linux(Fedora20)1——安装开启ssh服务
  19. ML(4)——逻辑回归
  20. java多线程----拒绝策略

热门文章

  1. Java多线程之线程的生命周期
  2. 使用WPF为Powershell程序制作GUI界面
  3. FineReport - 项目连接Oracle数据库
  4. Java之封装,继承,多态
  5. [SNOI2019]字符串
  6. P1251 餐巾计划问题 费用流
  7. 洛谷P1582 倒水 二进制 lowbit __builtin_popcount
  8. lightoj 1030-B - Discovering Gold (概率dp)
  9. Codeforces Round #383 (Div. 2)D. Arpa&#39;s weak amphitheater and Mehrdad&#39;s valuable Hoses(dp背包+并查集)
  10. Oracle sqlldr 在DOS窗口导入多列数据到数据库表