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

相关推荐
子兮曰8 小时前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
小羊没烦恼!9 小时前
微服务化的基石——持续集成
java·大数据·word·powerpoint·.net
子兮曰9 小时前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
俊昭喜喜里9 小时前
java中的继承和多态的区别
java
小羊没烦恼!9 小时前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
爱勇宝9 小时前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
譕痕9 小时前
JSONObject与JSONArray封装数据格式区别
java·json
胡写代码9 小时前
别再前后端各写一套表单校验了
java·后端
小鱼能吃糖9 小时前
缺陷修复总览 · mall电商项目:5类缺陷,1个病根,4个业务域
java·电商
此时不提桶,更待何时10 小时前
01-06-A-JVM排查实战详解
java·jvm