使用Map时,需要考虑什么

开发 后端
关于Java中的Map,已有很多文章讲述其较为完整的知识点了,本文不会再谈论这些知识点,而是从实际使用的角度,讲述笔者会考虑什么问题,算是对知识的一个应用,毕竟学了,最后还是要落地到使用中。

[[350721]]

关于Java中的Map,已有很多文章讲述其较为完整的知识点了,本文不会再谈论这些知识点,而是从实际使用的角度,讲述笔者会考虑什么问题,算是对知识的一个应用,毕竟学了,最后还是要落地到使用中。

首先,在使用Map前,我们先考虑第一个问题,为什么要使用Map这种数据结构。在工作中,笔者会想到使用到Map的场景通常有:

  1. 对数据按某种规则分组,用Key做分组的标识;
  2. 缓存,用Key做索引查找数据。

在确认要使用Map后,便需要考虑使用哪种Map。通常最先想到,也最常用的是HashMap。但需要注意两个地方,是否对线程安全、有序性有要求。

线程安全:

  1. 如果是不存在并发写入,则可以直接使用HashMap。
  2. 如果存在并发写入的情况,就需要使用线程安全的ConcurrentHashMap。

有序性:

  1. 如果是想按Key进行排序,就应该使用TreeMap。
  2. 如果是想按写入的顺序排序,则可以使用LinkedHashMap。如果要实现LRU,LinkedHashMap则是不二之选。

如果对有序性和线程安全同时有要求,那么需注意TreeMap和LinkedHashMap都不是线程安全的。对于TreeMap,可以使用Collections.synchronizedSortedMap 、synchronized和锁等方法来同步。同样LinkedHashMap,也可以使用Collections.synchronizedMap 、synchronized和锁来保证线程安全。

下面再进一步讨论对于使用HashMap的情况,如果是准备作为缓存来使用,且希望缓存可以自动清理,则可以使用WeakHashMap。

确定了Map的类型,最后会考虑的是,是否需要指定初始化大小。

在使用HashMap、ConcurrentHashMap和LinkedHashMap时,如果我们能预先知道存放元素的数量,则可以根据下面的公式计算出初始化大小并传入构造函数中,从而避免不必要的扩容。

总结:

  • 是否要使用Map;
  • 使用什么类型的Map合适;
  • 是否可以指定初始化大小。

以上就是笔者目前在使用Map时,会去考虑的一些事项,还有什么需要考虑的,欢迎留言讨论。

本文转载自微信公众号「 草捏子」,可以通过以下二维码关注。转载本文请联系 草捏子公众号。

 

责任编辑:武晓燕 来源: 草捏子
相关推荐

2016-06-14 10:12:56

网络管理网络性能管理网络性能监控

2019-08-12 07:55:12

物联网IOT技术

2015-03-26 10:35:44

运营商网络全球互联MPLS

2010-08-10 13:05:23

选择IT培训机构

2018-01-18 06:00:03

2022-05-11 15:30:36

智能建筑智能照明物联网

2013-05-13 10:41:01

完全虚拟化服务器虚拟化基础设施

2023-08-01 14:27:00

云端应用企业

2021-07-15 10:17:24

混合云云计算云迁移

2023-08-05 12:44:41

云端云技术性能

2022-11-21 18:00:26

GraphQLAPI开发

2022-04-11 15:01:44

网络弹性网络犯罪恶意软件

2023-03-16 13:56:19

周界安全工业安全

2021-04-19 09:31:32

物联网平台物联网IOT

2010-10-14 12:09:28

2014-04-03 09:08:26

2022-07-08 16:00:38

人工智能医疗保健

2022-06-30 08:03:13

Prisma数据库工具开源

2019-07-31 07:08:59

物联网企业IOT

2023-06-19 11:29:30

点赞
收藏

51CTO技术栈公众号