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开源的设计模式那些事儿

相关推荐
橙序员小站4 小时前
Agent Skill 是什么?一文讲透 Agent Skill 的设计与实现
前端·后端
怒放吧德德4 小时前
Netty 4.2 入门指南:从概念到第一个程序
java·后端·netty
雨中飘荡的记忆6 小时前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
开心就好20257 小时前
UniApp开发应用多平台上架全流程:H5小程序iOS和Android
后端·ios
悟空码字7 小时前
告别“屎山代码”:AI 代码整洁器让老项目重获新生
后端·aigc·ai编程
小码哥_常7 小时前
大厂不宠@Transactional,背后藏着啥秘密?
后端
奋斗小强7 小时前
内存危机突围战:从原理辨析到线上实战,彻底搞懂 OOM 与内存泄漏
后端
小码哥_常8 小时前
Spring Boot接口防抖秘籍:告别“手抖”,守护数据一致性
后端
心之语歌8 小时前
基于注解+拦截器的API动态路由实现方案
java·后端
None3218 小时前
【NestJs】基于Redlock装饰器分布式锁设计与实现
后端·node.js