ArrayList的底层实现

ArrayList的底层是数组,Object\[\]数组能存储不同类型的数据,只不过ArrayList在Object\[\]基础上结合泛型做了一层封装。

难用的数组

假设现在是JDK1.4的年代,你正在自己的IDE上编程:

当你需要往数组添加元素时,为了避免不小心覆盖已有的元素,你要时刻记住当前最新的index的值!是不是想骂人了?倒也不必,只需要每次使用时遍历出第一个为null的元素的位置即可。

虽然会消耗点性能,但好歹用起来省心。但还有个问题没解决:Java数组一旦初始化,长度就是固定的。上面的addElement方法虽然能避免ArrayIndexOutOfBoundsException,但缺点是数组满了以后会拒绝加入新元素,不会自动扩容。

支持动态扩容

为了解决这个问题,我们可以尝试把String数组包装成DynamicStringArray:

DynamicStringArray添加元素时无需考虑index的位置,并且支持自动扩容,极大减轻了使用者的心智负担。

加入泛型

你得意地开始在组内推广自己写的DynamicStringArray,却立刻遭到了同事的挑战:如果我要存的是Integer怎么办?你这才意识到,DynamicStringArray并不是一个通用的数组,它只为String类型服务!难道要再写一个DynamicIntegerArray?Person、Student、Department又该如何?

正当你陷入了迷茫的时候,Sun公司的一个员工也在思考这个问题。他发现,DynamicIntegerArray与DynamicStringArray唯一的区别就是元素类型,如果能对类型进行抽象,就能复用这套"动态数组"的逻辑。

具体怎么做呢?抽象!比如:

我们对1、2进行数据抽象得到Integer:

相似地,我们对数据类型进行类型抽象:

a是对数据的抽象,T是对类型的抽象

T被称为形式类型参数,类似我们常说的"形参",与之对立的是实际类型参数,是给它赋值的。

Java没有泛型数组,ArrayList底层用的是Object数组,但泛型可以进行约束

DynamicArray是一个通用的模板类,适用于任意类型的元素,同时还能进行编译时类型校验:

将DynamicArray的T"赋值"为Integer,表示:arr只处理Integer类型的元素

gitee开源的设计模式那些事儿

相关推荐
AOwhisky3 小时前
下一代容器来了?Docker 宣布原生支持 WebAssembly
java·运维·docker·容器·rust·wasm
Reart5 小时前
Leetcode 213.打家劫舍2(内含闲谈,打劫真是技术活,好题,716)
后端·算法
云云只是个程序马喽5 小时前
海外短剧平台搭建方案:私有化源码系统选型|云微短剧系统技术架构拆解
java·php
触底反弹5 小时前
🔥 RAG 到底是怎么工作的?掰开揉碎了给你讲明白!
javascript·人工智能·后端
techdashen5 小时前
Go 1.26 新增 `bytes.Buffer.Peek`:只看数据,不移动读取位置
开发语言·后端·golang
Reart5 小时前
Leetcode 198.打家劫舍(716)
后端·算法
C137的本贾尼6 小时前
第七篇:消息队列(MQ)——就是个带存储的异步通信管道
java·开发语言·中间件
Flittly6 小时前
【AgentScope Java新手村系列】(19)多模态-图像音频视频
java·spring boot·spring
Javatutouhouduan6 小时前
国内大厂Java面试高频题库(2026突击版)
java·架构师·java面试·java面试题·后端开发·java程序员·java八股文
Java编程爱好者6 小时前
Spring6.0+Boot3.0:秒级启动、万级并发的开发新姿势
后端