如何根据场景判断是使用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...

相关推荐
雨中飘荡的记忆10 小时前
Retrofit:优雅的JAVA网络请求框架实战
java
没带西川地图的张永年10 小时前
springboot加载配置文件几种方式
后端
Thexhy10 小时前
基础篇:Redis核心命令及用法
java·linux·redis
镜花水月linyi10 小时前
执行SELECT/INSERT/UPDATE/DELETE的SQL语句,MySQL流程是怎么样的?
后端·mysql
狂奔小菜鸡10 小时前
Day33 | Java中的Optional
java·后端·java ee
啃火龙果的兔子10 小时前
IntelliJ IDEA社区版下载安装
java·ide·intellij-idea
ckm紫韵10 小时前
Cursor 与 IDEA 互相跳转教程
java·ide·intellij-idea·cursor·ai工具
天若有情67310 小时前
我发明的PROTO_V4协议:一个让数据“穿上迷彩服”的发明(整数传输协议)
网络·c++·后端·安全·密码学·密码·数据
渡过晚枫10 小时前
[蓝桥杯/java/算法]攻击次数
java·算法·蓝桥杯
游浪踏10 小时前
003_AI Agent(模拟实现)
后端·agent