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

 

Java Map知识点的更多相关文章

  1. Java核心知识点学习----线程中如何创建锁和使用锁 Lock,设计一个缓存系统

    理论知识很枯燥,但这些都是基本功,学完可能会忘,但等用的时候,会发觉之前的学习是非常有意义的,学习线程就是这样子的. 1.如何创建锁? Lock lock = new ReentrantLock(); ...

  2. JAVA常用知识点及面试题总结

    1. String.StringBuffer.StringBuilder三者区别? (1)三者在执行速率上的比较: String<StringBuffer<StringBuilder 原因 ...

  3. Java 面试知识点解析(一)——基础知识篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  4. Java 面试知识点解析(四)——版本特性篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  5. Java 面试知识点解析(七)——Web篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  6. Java基础知识点(二)

    前言:Java的基础知识点不能间断. 1.Array和ArrayList的区别 关于Array的用法,参看:http://blog.csdn.net/b_11111/article/details/5 ...

  7. Java基础知识点(一)

    前言:本篇随笔,主要记录Java的基础知识点,不管是用于项目或者面试中,笔者认为都非常有用,所以将持续更新...... 1.Java的访问权限 Java中有四种访问权限:默认访问权限.public.p ...

  8. Java基础知识点总结

    前言 本文主要是我之前复习Java基础原理过程中写的Java基础知识点总结.Java的知识点其实非常多,并且有些知识点比较难以理解,有时候我们自以为理解了某些内容,其实可能只是停留在表面上,没有理解其 ...

  9. JAVA基础知识点总结(全集)

    1.JAVA简介 1.1java体系结构:j2se,javaweb,j2ee 1.2java特点:平台无关(虚拟机),垃圾回收(使得java更加稳定) 1.3 JDK与JRE,JDK:java开发环境 ...

随机推荐

  1. Redis各数据结构常用命令

    redis 通用API keys * 遍历所有key 一般不在生产环境中使用 redis单线程,容易阻塞其他命令执行 O(n) dbsize 计算key的总数 O(1)exists 检查key是否存在 ...

  2. Eclipse Paho MQTT Utility

    下载地址: https://repo.eclipse.org/content/repositories/paho-releases/org/eclipse/paho/org.eclipse.paho. ...

  3. codeforces 828 C. String Reconstruction(思维+优先队列)

    题目链接:http://codeforces.com/contest/828/problem/C 题解:有点意思的题目,可用优先队列解决一下具体看代码理解.或者用并查集或者用线段树都行. #inclu ...

  4. poj 2117 Electricity(tarjan求割点删掉之后的连通块数)

    题目链接:http://poj.org/problem?id=2117 题意:求删除一个点后,图中最多有多少个连通块. 题解:就是找一下割点,根节点的割点删掉后增加son-1(son为子树个数),非根 ...

  5. C++多例模式下对Instance的使用

    最近工作中遇到这样一个问题: 之前N年,公司用的都是一块CPU对应一块物理板,也就是,一块物理板只要一个实例化就可以了----俗称单例模式. 现在突然要一块CPU对应多块物理板,妥妥的多例模式啊.但是 ...

  6. 分析一次double强转float的翻车原因

    背景 人逢喜事精神爽,总算熬到下班撩~~ 正准备和同事打个招呼回家,被同事拖住问了.

  7. Java代理设计模式(Proxy)的几种具体实现

    Proxy是一种结构设计模型,主要解决对象直接访问带来的问题,代理又分为静态代理和动态代理(JDK代理.CGLIB代理. 静态代理:又程序创建的代理类,或者特定的工具类,在平时开发中经常用到这种代理模 ...

  8. Springboot源码分析之代理对象内嵌调用

    摘要: 关于这个话题可能最多的是@Async和@Transactional一起混用,我先解释一下什么是代理对象内嵌调用,指的是一个代理方法调用了同类的另一个代理方法.首先在这儿我要声明事务直接的嵌套调 ...

  9. Spring错误

    今天在学习spring的aop操作时碰到了一个问题: Caused by: org.springframework.aop.framework.AopConfigException: Cannot p ...

  10. 归并排序、jensen不等式、非线性、深度学习

    前言 在此记录一些不太成熟的思考,希望对各位看官有所启发. 从题目可以看出来这篇文章的主题很杂,这篇文章中我主要讨论的是深度学习为什么要"深"这个问题.先给出结论吧:"深 ...