Java中ArrayList与自定义动态扩容数组的本质差异及存储疑问
ArrayList与自定义动态数组的核心差异及存储说明
一、除接口和额外方法外的本质差异
- 泛型兼容能力:Java官方
ArrayList是泛型实现,能存储任意引用类型(基本类型会自动装箱成包装类),而你写的myArrayList只能存int,完全不支持其他类型,扩展性为零。 - 扩容策略更合理:
ArrayList默认按原容量的1.5倍扩容(用位运算oldCapacity >> 1实现,效率更高),这种方式能减少扩容次数,平衡内存占用和性能;还会根据实际需要的最小容量计算扩容值,避免浪费内存。而你的实现是固定加10,元素少的时候会浪费内存,元素多的时候扩容次数太频繁。 - 边界检查与异常友好性:
ArrayList的get方法会先做索引越界检查,抛出的IndexOutOfBoundsException会带具体的索引和长度信息,方便调试;你的get直接访问int[]数组,抛出的是原生数组越界异常,信息不够明确。 - 序列化与迭代器支持:
ArrayList实现了Serializable接口,能直接序列化;还实现了Iterable,提供安全的迭代器,迭代时集合被修改会触发快速失败机制(抛出ConcurrentModificationException),你的自定义类完全没有这些能力。 - 内存优化工具:
ArrayList有trimToSize()可以把数组容量缩到当前元素数量,节省内存;ensureCapacity()可以预先扩容,避免多次扩容的开销,这些细节你的类都没考虑。
二、不只是便捷工具
绝对不是。ArrayList是Java集合框架的核心组件,遵循List接口规范,能和其他集合(比如LinkedList、HashSet)无缝配合,还能直接用Collections工具类做排序、查找、同步包装等操作。你的自定义类没法融入这个生态,只能自己单独用,复用性极差,根本没法替代ArrayList在实际开发中的作用。
三、存储方式:两者都用堆存数据
- 你的
myArrayList里的int[] array是堆上的数组对象,itemsInArray作为实例变量,也是myArrayList对象的一部分,存在堆内存中。 ArrayList的内部存储是transient Object[] elementData,这个数组同样在堆上,存储的元素(引用类型或包装类实例)也在堆里,size等实例变量也属于堆上的ArrayList对象。
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

