Java常用底层数据结构设计思想-集合类-从ArrayList到HashMap

java面试题29 牛客 以下关于集合类ArrayList、LinkedList、HashMap描述 java面试题29 牛客 以下关于集合类ArrayList、LinkedList、HashMap描述错误的是() A HashMap实现Map接口,它允许任何类型的键和值对象,并允许将null用作键或值 B ArrayList和LinkedList均实现了List接口 C 添加和删除元素时,ArrayList的表现更佳 D ArrayList的访问速度比LinkedList快 蒙... 阅读详情

从ArrayList到HashMap:Java集合扩容与初始化的底层设计全解析

Java集合框架是开发中最核心的工具之一,其底层设计既体现了对数据结构特性的深度适配,也蕴含了“性能-内存-易用性”平衡的设计哲学。本文将从ArrayList的扩容逻辑切入,延伸至HashMap的初始化与扩容机制,结合JDK7到JDK8的迭代优化,完整拆解集合设计的核心思想与细节。

一、ArrayList:动态数组的扩容与初始化设计

ArrayList基于固定长度的数组实现,其核心挑战是在“数组长度不可变”的特性下,实现动态扩容,同时兼顾不同初始化场景的差异化需求。

1. 核心矛盾:数组固定长度 vs 动态容量

Java中数组一旦创建,长度无法修改。因此ArrayList的“扩容”本质是创建新数组 + 拷贝原数组元素,原数组会被垃圾回收。这是数组结构的必然选择,也是ArrayList“随机访问快、增删末尾快”的核心优势来源。

2. 初始化:无参构造 vs 带参构造(JDK7 vs JDK8)

ArrayList的初始化设计经历了JDK7到JDK8的关键优化,核心是引入“延迟初始化”和“双空数组标记”,区分不同初始化场景。

(1)JDK7的设计(存在缺陷)
  • 无参构造:直接创建容量为10的数组(new Object[10]),无论是否立即添加元素,都占用10个元素的内存。
  • 带参构造(传入0):创建空数组(new Object[0]),但与无参构造的“默认空数组”共用同一个引用,导致第一次添加元素时无法区分场景——带参0构造本应扩容到1,却和无参构造一样扩容到10,违背“用户指定容量优先”的原则。
(2)JDK8的优化:双空数组 + 延迟初始化

JDK8定义了两个空数组常量,用于标记不同初始化场景:

// 无参构造专用空数组(标记“默认初始化”)
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
// 带参构造(传入0)专用空数组(标记“用户指定0容量”)
private static final Object[] EMPTY_ELEMENTDATA = {};

// 无参构造:仅赋值空数组,延迟初始化
public ArrayList() {
    this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}

// 带参构造(传入0):赋值另一个空数组
public ArrayList(int initialCapacity) {
    if (initialCapacity > 0) {
        this.elementData = new Object[initialCapacity];
    } else if (initialCapacity == 0) {
        this.elementData = EMPTY_ELEMENTDATA;
    } else {
        throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity);
    }
}
  • 延迟初始化:无参构造不再直接创建容量10的数组,而是赋值空数组,直到第一次调用add()才触发扩容,节省初始内存。
  • 场景区分:通过“数组引用是否为DEFAULTCAPACITY_EMPTY_ELEMENTDATA”,在grow()方法中区分两种空数组:
    • 无参构造(默认空数组):第一次add扩容到10;
    • 带参0构造(另一个空数组):第一次add扩容到1。

3. 扩容核心逻辑:grow()方法

grow()是ArrayList扩容的核心方法,其逻辑兼顾“场景区分”和“统一扩容规则”:

private void grow(int minCapacity) {
    // 获取当前数组容量
    int oldCapacity = elementData.length;
    // 核心:1.5倍扩容(位运算实现,比乘法高效)
    int newCapacity = oldCapacity + (oldCapacity >> 1);
    
    // 处理第一次扩容的场景区分
    if (newCapacity - minCapacity < 0)
        newCapacity = minCapacity;
    // 处理默认空数组:强制扩容到10
    if (newCapacity - DEFAULT_CAPACITY < 0 && elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA)
        newCapacity = DEFAULT_CAPACITY;
    
    // 容量上限校验
    if (newCapacity - MAX_ARRAY_SIZE > 0)
        newCapacity = hugeCapacity(minCapacity);
    
    // 数组拷贝:创建新数组并迁移元素
    elementData = Arrays.copyOf(elementData, newCapacity);
}
(1)1.5倍扩容的设计考量

选择1.5倍而非更小(如1.1倍)或更大(如2倍)的扩容倍数,是平衡“扩容频率”和“内存浪费”的最优解:

  • 倍数太小:频繁扩容,数组拷贝的性能开销大;
  • 倍数太大:预留过多空闲空间,造成内存浪费;
  • 位运算优化:oldCapacity >> 1等价于oldCapacity / 2,位运算比乘法/除法更高效。
(2)扩容触发条件

ArrayList扩容的核心条件是:添加元素后,元素数量(size+1)超过当前数组容量。

  • 初始容量10:添加第11个元素时触发扩容;
  • 带参0构造:第一次add(size+1=1>0)触发扩容到1,第二次add(size+1=2>1)扩容到2,第三次add(size+1=3>2)扩容到3,后续按1.5倍递增(3→4、4→6、6→9…)。

4. ArrayList设计的核心思想

  • 延迟初始化:避免无参构造时直接分配内存,按需扩容;
  • 轻量级状态标记:通过两个空数组引用区分初始化场景,无需额外成员变量,实现代码复用;
  • 数据结构适配:基于数组固定长度的特性,选择“创建新数组+拷贝”的扩容方式,适配“随机访问快”的核心优势。

二、HashMap:哈希表的初始化与扩容设计

HashMap基于“数组+链表/红黑树”实现,其核心设计目标是高效的哈希计算与元素分布,因此数组长度必须是2的幂——这是HashMap所有初始化和扩容逻辑的核心前提。

1. 核心前提:数组长度必须为2的幂

HashMap要求数组长度为2的幂,核心是为了优化两个关键操作:

  • 高效索引计算:hash & (length-1) 等价于 hash % length,但位运算比取模运算快得多(仅当length为2的幂时成立);
  • 高效扩容迁移:扩容时数组长度翻倍,元素在新数组中的位置只需判断哈希码的高位,无需重新计算哈希,大幅提升扩容效率。

2. 初始化:无参构造 vs 带参构造

HashMap的初始化同样采用“延迟初始化”,但因数组长度必须为2的幂,其逻辑与ArrayList有本质差异。

(1)无参构造(JDK8+)
// 核心字段默认值:table=null、threshold=0、loadFactor=0.75
transient Node<K,V>[] table;
int threshold;
final float loadFactor;

// 无参构造:仅赋值负载因子,table和threshold沿用默认值
public HashMap() {
    this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted
}
  • 延迟初始化:无参构造仅给loadFactor赋值为0.75,table(数组)默认null,threshold(阈值)默认0;
  • 首次put触发初始化:第一次调用put()时,通过resize()方法将table初始化为长度16的数组,threshold计算为16 * 0.75 = 12(容量×负载因子)。
(2)带参构造:tableSizeFor()方法的核心作用

带参构造需要将用户传入的容量转换为“大于等于该值的最小2的幂”,这一逻辑由tableSizeFor()实现:

public HashMap(int initialCapacity) {
    this(initialCapacity, DEFAULT_LOAD_FACTOR);
}

public HashMap(int initialCapacity, float loadFactor) {
    // 参数校验...
    this.loadFactor = loadFactor;
    // 转换为最小2的幂,临时存入threshold(首次put时再作为数组容量)
    this.threshold = tableSizeFor(initialCapacity);
}

3. 核心方法:tableSizeFor()——将任意值转为2的幂

tableSizeFor()是HashMap初始化的核心,通过位运算将用户传入的容量转为最小2的幂:

static final int MAXIMUM_CAPACITY = 1 << 30; // 最大容量:2^30

static final int tableSizeFor(int cap) {
    // 步骤1:预处理,统一处理“cap是2的幂”和“cap不是2的幂”
    int n = cap - 1;
    // 步骤2:计算cap-1的二进制前导零个数(最高位1之前的0的个数)
    n = -1 >>> Integer.numberOfLeadingZeros(n);
    // 步骤3:边界处理,返回最小2的幂
    return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
(1)逐行拆解tableSizeFor()
  • cap - 1:关键预处理,避免“cap本身是2的幂时,转换结果偏大”。例如:cap=16→15,最终转换结果仍为16;cap=10→9,转换结果为16(大于10的最小2的幂)。
  • Integer.numberOfLeadingZeros(n):计算n的二进制前导零个数。例如:n=9(0b1001)→前导零28个;n=15(0b1111)→前导零28个。
  • -1 >>> 前导零个数:-1的二进制是全1(0b11111111),无符号右移前导零个数后,得到“最高位1后全1”的数。例如:-1>>>28→0b1111(15)。
  • n + 1:将“最高位1后全1”的数转为2的幂。例如:15+1=16,31+1=32。
(2)特殊情况处理
  • 传入cap=0/1:cap-1=-1/0,最终返回1(数组长度不能为0);
  • 传入cap≥MAXIMUM_CAPACITY:返回MAXIMUM_CAPACITY(避免溢出)。
(3)示例验证
传入capcap-1前导零个数n=-1>>>前导零n+1(最终容量)
0-10-11
103101
109281516
1615281516
1716273132

4. 扩容机制:JDK7 vs JDK8的核心优化

HashMap的扩容触发条件是:元素数量≥threshold(容量×负载因子),扩容后数组长度翻倍(仍为2的幂)。

(1)JDK7:头插法导致并发死循环

JDK7扩容时采用头插法迁移链表元素,新元素插入链表头部,并发场景下会导致链表指针反转,形成环形链表,后续get操作会陷入死循环:

  • 原链表:A→B→C;
  • 线程1迁移A后暂停,线程2迁移A、B,链表变为B→A;
  • 线程1恢复后处理B,导致A.next=B、B.next=A,形成环形链表。
(2)JDK8:尾插法解决并发环问题

JDK8将链表迁移改为尾插法,新链表顺序与原链表一致,避免指针反转:

  • 原链表:A→B→C;
  • 线程1/2迁移时,均按A→B→C的顺序尾插,节点next指针始终指向下一个节点,不会形成环。
(3)红黑树优化

JDK8引入红黑树解决链表过长的性能问题:

  • 链表转红黑树条件:链表长度≥8 且 数组容量≥64(数组容量<64时,优先扩容而非转树);
  • 红黑树转链表条件:树节点数≤6。

5. HashMap设计的核心思想

  • 位运算极致利用:通过tableSizeFor()将容量转为2的幂,优化索引计算和扩容;
  • 延迟初始化:无参构造仅赋值负载因子,首次put才创建数组,节省内存;
  • 场景适配:基于“数组+链表/红黑树”的结构,平衡哈希冲突和查询效率;
  • 并发问题优化:从JDK7头插法到JDK8尾插法,解决并发环形链表问题(但HashMap仍非线程安全,并发场景需用ConcurrentHashMap)。

三、ArrayList与HashMap设计的核心差异与共性

1. 核心差异(由底层数据结构决定)

维度ArrayListHashMap
底层结构普通数组数组+链表/红黑树
容量约束无约束(任意整数)必须为2的幂
初始化场景区分双空数组标记无需区分(用户指定0→1)
扩容触发条件size+1>当前容量size≥容量×0.75
扩容倍数1.5倍(位运算)2倍(保证2的幂)

2. 核心共性(设计思想层面)

  • 延迟初始化:均采用“首次操作触发初始化”,避免创建对象时浪费内存;
  • 轻量级状态标记:用最小的状态开销(如数组引用、默认值)区分场景,避免代码冗余;
  • 数据结构适配:所有逻辑均围绕底层数据结构的特性设计(数组固定长度、2的幂优化);
  • 性能-内存平衡:扩容倍数/触发条件均为“减少扩容频率”和“避免内存浪费”的折中。

四、总结:Java集合设计的底层逻辑

  1. 数据结构决定实现:ArrayList的数组拷贝、HashMap的2的幂约束,均是对底层数据结构特性的深度适配;
  2. 轻量级设计优先:通过引用标记、默认值等轻量级方式区分场景,而非额外成员变量,实现代码高内聚;
  3. 按需分配资源:延迟初始化、增量扩容,最大化减少内存浪费,兼顾性能与资源利用率;
  4. 迭代优化思维:JDK7到JDK8的优化(ArrayList双空数组、HashMap尾插法),体现了“发现问题-优化状态标记-统一逻辑”的迭代思路。

理解这些设计细节,不仅能帮助我们规避集合使用中的坑(如HashMap并发问题、ArrayList扩容时机),更能为自定义数据结构设计提供“场景区分、资源适配、性能平衡”的核心思路。

06_java常见集合类底层实现 List、Set、Map常见集合接口实现类源码学习 阅读详情

相关推荐

Java软件结构 设计和使用数据结构

Java 设计 数据结构 集合 自己实现Java集合框架。

java开发数据结构设计_java web个人博客开发(三数据结构设计)

1. 设计概要根据产品设计的功能和逻辑结构,进行数据结构的设计。可以看到产品中主要涉及内容有博主、博客内容、博主添加的博客分类。所以自然想到要有3个表对应这三部分内容信息。2. 数据结构图(powerdesigner画的)说明:该表的设计一些规则是根据阿里java开发手册,mysql规约部分完成,找个规则会省心一点。2.1 博客应用该部分有4个表组成,具体信息看图即可,具体关联关系,一对多在"多"...

weixin_32171133的博客 353

5分钟搞定PaddleOCR PP-OCRv5环境搭建:从安装到第一个识别Demo

本文提供了一份详细的PaddleOCR PP-OCRv5环境搭建与快速入门指南。通过清晰的步骤,指导读者在5分钟内完成从创建Python虚拟环境、安装PaddlePaddle框架和PaddleOCR库,到编写并运行第一个OCR识别Demo的全过程,帮助开发者快速体验最新的PP-OCRv5模型的文字识别能力。

sprite的博客 1267

java数据结构

一、java集合   研究表明,人类大脑右脑的记忆能力是左脑的10万的倍,右脑对图形图像处理比较敏感,因而借助于图形图像能快速提高记忆效率,废话不多说,直接上图:                       Collection集合体系继承关系                    Map集合体系继承关系 1、线性表的性能分析 各种线性表的性能分析概览: 1.1、数组   以一块连续内存区来保存所有的数组元素,所以数组在随机访问时性能最好。所有的内部以数组作为底层实现的集合在随

m0_67698950的博客 4939

Oracle EBS财务模块(三)总账功能

(一)总账管理系统主要功能  总账管理系统(Oraclegeneralledger)是一个公司一切账务系统的核心,它好比是公司会计信息的中央处理器。总账管理系统提供了一个完整的财务管理核算及分析流程。它是所有子账户的信息存储器,因此反映了所有子账户的财务和现金活动。总账管理系统的主要作用是记录公司的财务活动,并生成财务报表和管理报表,以帮助公司内外人士进行决策。一个公司或组织的制造系统、项目管理系

苏南生的优快云博客 2万+

运维与软件实施课表

运维与软件实施课表 课程 章节编号 章节 课程地址 软件及操作系统基础 ch01 软件及操作系统基础01 实施、运维工程师基本技能:https://blog.youkuaiyun.com/qq_28189423/article/details/82700539 老毛桃制作winPE镜像:https://blog.youkuaiyun.com/qq_2818942...

Mr.O~的博客 1万+

Java数据结构课程设计(fntp开源)

java数据结构课程设计(哈夫曼树压缩实现) 开源作者:fntp QQ358566760欢迎读者与笔者交流沟通 使用java数据结构与算法,来实现哈夫曼树压缩文本数据,如何实现呢? 哈夫曼树简单介绍: 在计算机数据处理中,哈夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码,其中变长编码表是通过一种评估来源符号出现机率的方法得到的,出现机率高的字母使用较短的编码,反之出现机率低的则使用...

FNTP_ 3374

从网格划分到结果解读:一次完整的子弹侵彻LS-DYNA仿真避坑指南

本文详细解析了子弹侵彻LS-DYNA仿真中的关键技术与避坑指南,涵盖网格优化、对称边界条件设置、沙漏控制参数调整及结果可信度验证。通过HyperMesh网格划分和LS-DYNA高级参数配置,帮助工程师提升仿真精度与效率,确保计算结果物理可信。

weixin_29816689的博客 406

java集合类的底层类是哪个

hello啊,各位观众姥爷们!!!本baby今天又来报道了!哈哈哈哈哈嗝🐶。

牛马baby的博客 1736

软件可靠性设计

本文系统介绍了软件可靠性设计与建模的理论框架和实施方法。首先从可靠性定义、核心思想和与建模的关系等理论基础出发,重点阐述了模块化设计、冗余容错、异常处理等六类可靠性设计方法及其技术栈。文章详细分析了可靠性设计在软件生命周期各阶段的应用,并深入探讨了设计与建模的深度结合机制,包括参数影响、验证方法和量化指标。最后提出了覆盖设计、开发、测试和运行四个阶段的落地策略,形成完整的"设计-建模-运行"流程体系。全文强调通过预防性设计和量化建模相结合的方法提升软件系统的可靠性和稳定性。

moton2017的博客 896

【知识图谱】Neo4j基本操作及数据库文件导入(graph.db.dump)

初探Neo4j导入数据备份数据客户端操作导入csv文件指定csv文件格式使用命令行导入csv文件附录 请读者参考上篇博文 Neo4j安装教程 导入数据 若开启服务,先在终端停止 Neo4j 服务 ./neo4j stop 接下来,下载射雕三部曲的数据库文件 wget https://labfile.oss.aliyuncs.com/courses/1354/graph.db.dump 下载完将出现 graph.db.dump 文件: 将数据库文件导入到 Neo4j 中 首先进入neo4j 根目录下:

全网粉丝30W+,优快云、稀土掘金人工智能领域签约作者,人工智能、大模型、Python 爬虫,商务合作,请私信沟通。 8619

鬼知道我看了几遍!Java常用集合类总结:ArrayList+LinkedList+Vector+HashMap+Set类+Queue/Deque类集合

JDK提供了大量优秀的集合实现供开发者使用,合格的程序员必须要能够通过功能场景和性能需求选用最合适的集合,这就要求开发者必须熟悉Java的常用集合类。本文将就JavaCollectionsFramework中常用的集合及其特点、适用场景、实现原理进行介绍,供学习者参考。当然,要真正深入理解Java的集合实现,还是要推荐去阅读JDK的源码。 点个小赞,好运不断,来个关注,青春常驻,打个小赏,工资疯涨。。。 Java提供的众多集合类由两大接口衍生而来:Collection接口和Map接口 Collecti.

banzhuanhu的博客 4089

足式机器人全身 MPPI: 利用 MPPI 对足式机器人进行实时全身控制

本研究首次在真实四足机器人上成功部署了基于全身采样的模型预测控制(MPC)系统。采用模型预测路径积分(MPPI)算法,通过并行采样和评估控制轨迹实现实时运动规划。该系统能处理复杂接触场景,完成推箱子、爬越障碍及崎岖地形行走等任务。实验使用Unitree Go1机器人,结合MuJoCo仿真器快速生成运动策略,仅需简单控制策略即可实现稳健操作。硬件验证表明,该方法能有效完成目标导向的箱子推动任务。该成果标志着采样MPC在足式机器人实际应用中的重要突破。

2506_90492529的博客 999

ArrayList vs LinkedList,HashMap vs TreeMap:如何选择最适合的集合类?

在 Java 开发中,集合类的选择直接影响程序的性能和代码的可维护性。不同的数据结构适用于不同的场景,盲目使用可能导致内存浪费、性能下降甚至逻辑错误。本文将从底层原理、时间复杂度、内存占用和典型场景出发,对比分析ArrayListvsLinkedListHashMapvsTreeMap,帮助你做出合理选择。

qq479850581的博客 1276

chromium通信系统-ipcz系统(二)-ipcz系统代码实现-同Node通信

在chromium通信系统-mojo系统(一)-ipcz系统基本概念一文中我们介绍了ipcz的基本概念。 本章我们来通过代码分析它的实现。 handle系统 为了不对上层api暴露太多细节,实现解耦,也方便于传输,ipcz系统使用handle表示一个对象,handle类似于文件描述符,用IpczHandle类型表示ipcz系统内的一个对象。一个可以用IpczHandle 句柄表示的对象必须是APIObject子类。APIObject数据结构如下 class APIObject : public RefCou

woai110120130的专栏 1775

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Java基础之集合类如ArrayList、LinkedList、HashMap、HashTable的区别

博客出自:http://blog.youkuaiyun.com/liuxian13183,转载注明出处! All Rights Reserved !ArrayList是一个动态数组,有下标LinkedList是一个双向链表,一个指针指向下一个相同点:都继承自Collections类,放动态数据。不同点:后者有指针,增加一个数据,只用断开一个连接,分别将新数据连上删除一个数据,区别在于如果这个数据位于数组中间...

劝学 3988

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Java集合类( ArrayList LinkedList HashMap底层实现)

最近在复习数据结构,于是把java集合类重新复习一遍~~ ArrayList的底层实现: public class MyArrayList { //实质是一个数组 private Object[] ElementData; //集合大小[注:集合大小用size表示,数组大小才有length] private int size; //构造函数 没有...

kaylee_study的博客 521

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

常用的集合类

Java 集合框架(Java Collections Framework, JCF)是 Java 提供的一组接口和类,用于处理集合数据。集合框架的核心接口包括CollectionListSetQueue和Map,它们代表了不同类型的集合结构。通过这些接口,Java 提供了各种具体实现,能够满足多样化的数据处理需求。Java 提供了丰富多样的集合类,以满足不同场景下的数据管理需求。ArrayList和LinkedList是最常用的列表实现类,分别适用于频繁读取和频繁插入删除的场景。HashSet和。

Flying_Fish_roe的博客 1277

Java基础:集合类之ArrayList、HashMap简介

Java基础:集合类之ArrayList、HashMap简介

xueping_wu的博客 1367

Java集合 - 5000字带你从 ArrayList 到 HashMap

为了帮助开发者更高效地使用集合类。文章从集合框架概览入手,介绍了 Collection 和 Map 两大体系,并对常用的 ArrayList、LinkedList、HashMap、HashSet 等集合类的用途、优缺点及适用场景进行了详细讲解。

引用原创内容标明出处即可 1424

Java中HashMap常用方法示例、使用Map和HashMap定义的区别及定义ArrayList及HashMap等数据结构时 HashMap<K,V> should be parameterized

put() 将键/值对添加到 hashMap 中putAll() 将所有键/值对添加到 hashMap 中putIfAbsent() 如果 hashMap 中不存在指定的键,则将指定的键/值对插入到 hashMap 中。get() 获取指定 key 对应对 valuegetOrDefault() 获取指定 key 对应对 value,如果找不到 key ,则返回设置的默认值replace() 替换 hashMap 中是指定的 key 对应的 value。

本博客记录了从2014年以来在工作学习中遇到的技术问题、解决方法以及部分个人人生经历、经验等内容。 1368

Java 集合之数据结构基础与常用集合类剖析

在这篇博客中,我们将深入探讨 Java 集合相关的知识。上一篇我们对课程进行了介绍,了解到这一系列主要针对 Java 集合相关面试题展开,重点关注高频面试内容。这一篇我们开始详细讲解集合相关的数据结构以及重点集合类的特性和用法。

m0_57836225的博客 715

深入剖析 Java 集合底层实现:ArrayList、HashSet 与 HashMap 的核心原理

ArrayList 展示了动态数组的实现艺术,通过扩容机制平衡了空间利用率和操作效率HashSet 巧妙地利用了 HashMap 的特性,用极少的代码实现了高效的去重集合HashMap 则是哈希表思想的完美实践,通过数组 + 链表 / 红黑树的混合结构,在平均情况下实现了 O (1) 的操作复杂度理解这些集合的底层实现,不仅能帮助我们在实际开发中选择合适的集合,更能让我们学到如何将基础数据结构与实际需求结合,设计出高效的算法和数据结构。

qq_2736443428的博客 865

Java029—Java常用集合类概述ArrayList、LinkedList、HashSet、TreeSet、HashMap、TreeMap

一、集合类概述 二、Collection接口 package com.dgut.test; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Collection; import java.util.Date; import java.util.Iterator; public class Test001 { public static void main(String[] args

weixin_45084986的博客 1161

HashMap和ArrayList的原理

前言 面试过程中经常会被问到HashMap或者ArrayList相关的问题,简单的话就会问一些使用方面上的区别,难一点的话就会问他们之间的原理,今天我们就由浅入深的来分析他们之间的原理与区别。

真正的大师永远怀着一颗学徒的心 1678
上一篇: Java开发者破局指南:跳出内卷,借AI赋能,搭建系统化知识体系
下一篇: Java常用底层数据结构设计思想-集合类-复用强相关的闲置变量
Coder_Boy_
博客等级 码龄10年 2804粉丝 819原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder_Boy_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值