外观
ArrayList、HashMap、ConcurrentHashMap 怎么选?
标准回答
顺序数据和按索引访问常用 ArrayList;按键查找常用 HashMap;多个线程共享键值数据时,按需求使用 ConcurrentHashMap 或显式同步方案。
关键机制
- ArrayList 是动态数组,按索引访问快,中间插删需要移动元素;容量增长有复制成本。
- HashMap 依赖 hashCode 与 equals。相等对象必须有相同 hashCode;用作 key 后不要随意修改参与相等判断的字段。
- ConcurrentHashMap 提供线程安全操作,但多次独立调用组合起来不自动成为原子事务;优先使用 putIfAbsent、compute 等匹配语义的接口。
通俗例子
先 containsKey 再 put,在两线程竞争时仍可能重复初始化。按需求使用原子创建逻辑,并避免在映射函数里做长时间阻塞。
易混淆点
线程安全容器不等于其中的可变对象也线程安全。HashMap 也不能靠“写得少”就安全地跨线程共享。
参考资料
内容来源
- Android 技术札记 · 原条目
collections