前言

Map是java中用于存储键值对映射的接口。是解决编程问题最常用的数据结构之一。
在工作中,有时候为实现一个功能可能写了好大一段代码,运行是ok了,但是就是不想回头再看,不敢相信自己写的这么烂。这个时候其实可以多考虑下map这种结构了,说不定能更简洁地实现呢。
引用《编程思想》中一个代码示例:
测试Random可以产生理想的数字分布。其实就是统计一个产生随机数的次数。

public class RandomTest {
@Test
public void testRandom()
{
Random rand =new Random(47);
Map<Integer,Integer> map = new HashMap<Integer, Integer>();
for(int i = 1; i < 10000; i++)
{
int r = rand.nextInt(20);
Integer freq = map.get(r);
map.put(r, freq == null ? 1 : freq + 1);
}
System.out.println(map);
}
}

输出结果:
{0=481, 1=502, 2=488, 3=508, 4=481, 5=503, 6=519, 7=471, 8=468, 9=549, 10=513, 11=531, 12=521, 13=506, 14=477, 15=497, 16=533, 17=509, 18=478, 19=464}

Map接口的常用实现类

  • HashMap
  • LinkedHashMap
  • TreeMap
  • ConurrentHashMap
  • Hashtable
  • WeakHashMap

一般来说,HashMap是你的第一选择,因为它对速度进行了优化。如果有其他比如排序或是线程安全方面的需求时,才考虑选择其他的实现。

HashMap特性告白
基于散列表实现,存储key的顺序不是插入的顺序。可以通过构造器设置容量和负载因子,以调整容器性能。
遍历HashMap的几种方法:

	// for循环entryset
for(Entry<Integer,Integer>entry : map.entrySet())
{
System.out.println("key:" + entry.getKey() + ",value:" + entry.getValue());
} // 遍历key获取values
for (Integer key : map.keySet())
{
System.out.println(key + "===" + map.get(key));
} // 遍历values
for (Integer value : map.values()) {
System.out.println("value:" + value);
}

LinkedHashMap 特性告白
类似于HashMap,通过链表来维护插入key的顺序,保证放入和取出的顺序是一致的。
如果使用场景中既要求映射关系、又要保证存储顺序,可以选择此种实现类。
性能上较HashMap慢一点。迭代访问时能快点,因为链表的缘故。

TreeMap 特性告白
基于红黑树实现。查看“键”或“键值对”时,它们会被排序(次序是由Comparable或Comparator决定)。

  • 要么存储进入TreeMap的对象时实现了Comparable接口的可比较对象
  • 要么在创建TreeMap容器时需要传入比较器对象Comparator

ConurrentHashMap 特性告白
java.util.concurrent包中的线程安全的映射容器。
主要为了解决HashMap线程不安全和Hashtable效率不高的问题。

Hashtable 特性告白
是Hashtable,而不是HashTable呦!
基本和HashMap很类似,只是Hashtable的方法加了synchronized重量级锁来保证线程安全性。

WeakHashMap 特性告白
“弱键”映射,允许释放映射所指向的对象;主要是为解决某类特殊问题而设计的。如果映射之外没有引用指向某个“键”,则此“键”可以被垃圾收集器回收。(还没用过,先晓得有这种“高级容器”吧)

总结

本编主要从编码使用层面总结了常用map映射集合的实现类及其各自特性。

关注蚂蚁君,不放过每一次学习的机会。

最新文章

  1. Git版本库
  2. 急!JDBC问题,发生通信错误。错误位置:Reply.fill()。消息:数据不足。 ERRORCODE=-4499, SQLSTATE=08001
  3. 工作随笔——tar命令批量解压
  4. Java多线程 wait, notify 和 notifyAll
  5. linux下,一些关于动态库的问题:
  6. 文件I/O操作(1)
  7. 个人笔记--Servlet之过滤器实现权限拦截
  8. Calendar使用
  9. 【shell脚本实例】一个恶作剧—— kill掉占用CPU较高的matlab进程
  10. Token&amp;Cookies&amp;Session
  11. JMeter 压测基础(四)——Java工程测试
  12. 爬坑二 activiti流数据库版本错误引发的问题
  13. 通过IP地址定位准确的地理位置
  14. [工具]JSON校验、转换在线工具
  15. iOS 微信支付SDK与微信友盟分享两者同时集成时,出现的问题与解决之路。
  16. 转:在决定使用ClickOnce发布你的软件前,应该知道的一些事情(一些常见问题解决方法)
  17. webpack 多页面|入口支持和公共组件单独打包--转载
  18. python的上下文管理(contextlib)(2)
  19. xampp 安装 mysql-python
  20. File类--System.out.print(Object obj)的理解

热门文章

  1. Jest测试框架入门
  2. 微信小程序——template详细使用
  3. 大型情感剧集Selenium:3_元素定位 #华为云·寻找黑马程序员#
  4. 【nodejs原理&源码赏析(7)】【译】Node.js中的事件循环,定时器和process.nextTick
  5. 每个开发人员都应该知道的11个Linux命令
  6. 思科CISCO ASA 5521 防火墙 Ipsec 配置详解
  7. [开源] .Net 使用 ORM 访问 达梦数据库
  8. Servlet和Tomcat底层源码分析
  9. java之面向对象
  10. UESTC-1963咸鱼咕咕咕(二分图匹配)