array是语言级固定长度基础结构,arraylist是基于它封装的动态扩容工具类;前者支持基本类型、无内置方法、编译期无泛型检查,后者仅存对象、提供丰富api、具备泛型类型安全。

区分 Array 和 ArrayList,关键看四个实际维度:长度是否可变、能存什么类型、怎么操作数据、性能表现如何。它们不是同类东西——Array 是语言级基础结构,ArrayList 是基于 Array 封装的工具类。
长度能不能自己变
Array 一旦创建,长度就锁死了。比如 int[] arr = new int[5],之后既不能加第6个元素,也不能删掉一个让长度变4。想“扩容”,只能手动新建数组、复制老数据——麻烦且容易出错。
ArrayList 完全不用操心这个。调用 add() 时,它自动判断容量够不够;不够就悄悄建个更大的数组(通常是原容量的1.5倍),再把老元素搬过去。你只管加,它负责撑开空间。
能不能直接放 int、char 这种基本类型
Array 可以:int[]、double[]、boolean[] 都合法,内存紧凑,没额外开销。
ArrayList 不行。它只能存对象,所以存整数得用 ArrayList<integer></integer>。这意味着每次 add 或 get 都会触发自动装箱/拆箱——对大量数值运算来说,这会带来可测的性能损耗。
有没有现成的方法帮你干活
Array 很“原始”:只有 length 属性,访问靠 arr[i],增删改查全得自己写循环或逻辑。
ArrayList 是“功能包”:内置 add()、remove(int index)、contains()、indexOf()、addAll()、迭代器支持……这些方法把常见操作封装好了,代码更短、更易读、更少出 bug。
类型安全是在编译期还是运行期检查
ArrayList 支持泛型,比如声明为 ArrayList<string></string>,编译器就会拦住你往里面 add(123) 或 add(new Date()),错误在写代码时就暴露。
Array 也做类型检查,但要等到运行时。比如你声明了 String[] s = new String[2],却写了 s[0] = new Integer(1),程序跑起来才会抛 ArrayStoreException——这种问题更难定位。










