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

相关推荐
每天都要加油呀!22 分钟前
多租户中间件适配
java·多租户
FelixBitSoul36 分钟前
缓存淘汰策略全解:从原理到手写实现(Java / Go / Python)
后端·面试
014-code1 小时前
Java 并发中的原子类
java·开发语言·并发
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题】【Java基础篇】第29题:静态代理和动态代理的区别是什么
java·开发语言·后端·面试·代理模式
善恶怪客1 小时前
Java-数组和可变参数
java·开发语言
小编码上说1 小时前
LSH(局部敏感哈希)分桶,海量数据下的相似性搜索解决方案
java·spring boot·缓存·langchain4j·lsh·局部敏感哈希·ai调用优化
计算机_毕业设计1 小时前
java-springboot数字藏品系统 基于 SpringBoot 的区块链数字艺术品交易平台 Java 微服务架构下的加密藏品展示与拍卖系统计算机毕业设计
java·spring boot·课程设计
ONVO ncen1 小时前
Redis6.2.6下载和安装
java
丑八怪大丑1 小时前
JDK8-17新特性
java·开发语言
京师20万禁军教头2 小时前
37面向对象(高级)-main方法
java