优点
-
高效的随机访问
数组在内存中是连续存储的,通过索引可直接计算元素地址,访问时间复杂度为 O(1),性能极高。 -
内存紧凑,无额外开销
数组直接存储数据,无需像链表维护指针或对象头信息,内存利用率高。尤其适合基本数据类型(如int[]
、char[]
),避免自动装箱(如ArrayList<Integer>
的额外对象开销)。 -
多维支持简单
直接支持多维数组(如int[][]
),语法直观,而集合框架需要嵌套(如ArrayList<ArrayList<Integer>>
)。 -
与底层操作兼容
常用于文件I/O、图形处理等需要连续内存的场景(如byte[]
处理二进制数据)。
缺点
-
固定长度,无法动态扩容
数组长度在初始化后不可变,扩容需手动创建新数组并复制数据(Arrays.copyOf()
),效率低。 -
插入/删除效率低
在数组中间增删元素时,需要移动后续元素(时间复杂度 O(n)),不适合频繁修改的场景。 -
功能单一,缺乏高级API
没有内置方法支持搜索、排序等操作,需依赖工具类(如Arrays.sort()
),不如集合框架(如ArrayList
)便捷。 -
类型限制
只能存储单一类型元素(编译时检查),且数组类型是协变的(如String[]
可赋值给Object[]
),可能导致运行时错误(ArrayStoreException
)。 -
不支持泛型
无法直接创建泛型数组(需通过强制类型转换),类型安全性不如集合框架。
适用场景
-
数据量固定且高频访问:如缓存、数学计算(矩阵运算)。
-
性能敏感场景:需直接操作内存或与底层API交互(如网络传输)。
-
简单存储基本类型:避免装箱拆箱开销。
替代方案
若需动态大小或丰富操作,优先选择集合框架:
-
ArrayList
:动态数组,自动扩容,支持泛型。 -
LinkedList
:高效插入/删除。 -
其他工具类:如
Arrays
和Collections
提供排序、搜索等静态方法。