如何根据场景判断是使用ArrayList还是LinkedList?

介绍

本文将以 HashMap 为例,使你了解ArrayList与LinkedList分别适合怎么样的使用场景,以及如何分析一个场景是使用ArrayList还是LinkedList?

HashMap介绍

存储结构

对应到程序中的结构为

java 复制代码
// 数组
transient Node<K,V>[] table;

// 链表节点
static class Node<K,V> implements Map.Entry<K,V> {
    final int hash;
    final K key;
    V value;
    Node<K,V> next;
}

获取元素

分析

  • get: 在使用HashMap时get元素时,首要通过对key的hash取模运算得到对应的Hash桶,再遍历hash桶来获取到元素的对应值。
  • 添加: 1.7 及以前如果找不到元素就在链表的头部添加,1.8 将添加位置换为了尾部
  • (删除、修改就是对读取到的Node进行对应的删改操作,这里就不做过多解释)

HashMap将存储Hash桶的结构设计为Array,将Hash桶结构设计为Link

为什么存储HashMap要这样设计?

现在假设将存储Hash桶的结构改为了链表存储,Hash桶的存储结构改为了数组存储。通过对HashMap的实现结构进行调换,来分析会出现什么样的问题(原来的实现相对有什么优点)。


存储Hash桶的结构换为Link

1. 基于查询分析"首先需要通过对key的hash取模运算得到对应的Hash桶"): 在这一步骤中,我们使用链表存储势必要通过遍历的方式获取到对应下标上的Hash桶,时间复杂度在O(n)。但是,通过ArrayList来获取到对应的Hash桶便可以达到O(1) 的时间复杂度

2. 基于 删除、修改、添加 分析 在删除、修改、添加操作中只有添加可以对存储Hash桶的结构造成影响,具体的影响就是HashMap的扩容。如果通过数组实现那么在扩容需要重新申请内存空间,通过rehash将元素整体迁移,通过链表实现不需要申请新的内存空间,但是依然需要通过rehash将元素整体迁移。

3. 总结 在查询时数组完胜。在删除、修改、添加时,时间消耗的大头是rehash申不申请内存对整体的影响并不大,综合结论得出 存储Hash桶结构为Array时要比Link要优秀


Hash桶结构换为Array

1. 基于查询分析"再遍历hash桶来获取到元素的对应值。") 在这一步骤中,无论是Link还是Array都需要通过对整体进行遍历来完成元素的查找工作,彼此相差不大

2. 基于 删除、修改、添加 分析 在删除、修改、添加时需要频繁的对存储进行修改。如果使用Array就需要预分配好一定长度的空间,不预先分配一定的长度就需要频繁的创建Array来满足对元素的删除、修改、添加,而Link就不需要考虑这里扩容的问题。

3. 总结 查询两者都相差不大,但是在 删除、修改、添加 中Array却需要预分配内存或者是频繁创建,在此场景下:Link要比Array要更加优秀

总结

在ArrayList与LinkedList的对比中基本上可以看作是数组和链表在做对比。希望通过这种对比分析方式能够让你明白如何去分析到底是使用ArrayList还是LinkedList。如果想要了解更多这两个链表的详细信息请跳转至juejin.cn/post/741143...

相关推荐
我真的是大笨蛋4 分钟前
K8S-Pod(上)
java·云原生·容器·kubernetes
我是哪吒16 分钟前
分布式微服务系统架构第170集:Kafka消费者并发-多节点消费-可扩展性
后端·面试·github
纪元A梦28 分钟前
贪心算法应用:数字孪生同步问题详解
java·算法·贪心算法
Micrle_00740 分钟前
java分布式场景怎么实现一个高效的 读-写锁
java·分布式
海上生明月丿44 分钟前
微服务01
java·spring boot·微服务
Badman1 小时前
分布式系统下的数据一致性-Redis分布式锁
redis·分布式·后端
Java水解1 小时前
盘点那些自带高级算法的SQL
后端
coooliang1 小时前
【鸿蒙 NEXT】V1迁移V2状态管理
java·前端·harmonyos
Luke Ewin2 小时前
FunASR的Java实现Paraformer实时语音识别 | 一款无需联网的本地实时字幕软件
java·人工智能·语音识别·asr·funasr·paraformer·sensevoice