java数组长度固定,动态调整需创建新数组并复制数据;手动扩容可用arrays.copyof()或system.arraycopy();缩容同理,仅保留有效元素;可封装dynamicarray工具类实现自动扩缩容。

Java 中数组长度是固定的,无法直接动态调整。要实现“动态调整”,本质是创建新数组、复制数据、替换引用——这是所有模拟方案的共同逻辑。
手动扩容:最基础的模拟方式
当需要增加容量时,创建一个更大的新数组,把原数组元素复制过去,再用新数组替换原引用。
- 使用 Arrays.copyOf() 最简洁:`arr = Arrays.copyOf(arr, newSize);`
- 手动用 System.arraycopy() 更可控:`int[] newArr = new int[newSize]; System.arraycopy(oldArr, 0, newArr, 0, oldArr.length);`
- 注意:若 newSize 小于原长度,copy 会截断;大于则新增位置补默认值(如 int 补 0)
手动缩容:避免内存浪费
缩容不是简单“减小长度”,而是同样新建更小数组并复制有效数据。
- 例如保留前 n 个元素:`arr = Arrays.copyOf(arr, n);`
- 若只删末尾几个,直接 copy 前 n 位即可,无需遍历或置空
- 缩容后原数组若无其他引用,会被 GC 回收
封装成工具类:提升复用性
可封装一个 DynamicArray 工具类,内部持有一个 Object[](或泛型数组),对外提供 add、remove、resize 等方法。
- add 方法内部判断容量不足时自动扩容(如 1.5 倍增长)
- remove 方法可配合缩容策略(如 size
- 注意泛型数组创建限制:不能直接 new T[size],需用 Object[] + 类型转换或反射
与 ArrayList 的区别:别重复造轮子
ArrayList 底层正是基于 Object[] 动态扩容实现,已高度优化(包括扩容阈值、批量复制、fail-fast 等)。
- 日常开发优先用 ArrayList,它比手写更安全、高效、易维护
- 自己模拟主要用于学习理解底层机制,或嵌入式/性能极致场景下的定制需求
- 不要为“看起来更轻量”而放弃 ArrayList —— 它的开销极小,且经过充分验证
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











