一、基础定义
ArrayList :非泛型动态集合,属于早期 C# 版本,存储所有元素全部为 object 类型。
List<T> :泛型动态集合,T 代表指定数据类型,是 ArrayList 的升级版、替代版,项目开发全程使用 List<T>,不再使用 ArrayList。
二、五大核心对比(简答题满分答案)
1. 类型安全性(最大区别)
-
ArrayList :非泛型,存储 object,支持任意类型混搭,类型不安全,容易出现类型转换报错。
-
List<T> :泛型约束,创建时指定唯一数据类型,只能存储对应类型 ,类型绝对安全。
2. 装箱、拆箱(性能核心考点)
-
ArrayList :存储值类型时自动装箱,取值时手动拆箱,大量损耗性能。
-
List<T> :泛型固定类型,无装箱、无拆箱操作,执行效率极高。
3. 存储数据规则
-
ArrayList :可以存放 int、string、bool、对象等任意不同类型数据。
-
List<T> :只能存放定义时指定的单一类型数据,统一规范。
4. 写法与便捷度
-
ArrayList:取值需要强制类型转换,代码冗余、繁琐。
-
List<T>:无需转换类型,直接取值使用,代码简洁高效。
5. 适用场景
-
ArrayList :旧版本技术、过时技术,现项目开发基本淘汰,仅考试考察。
-
List<T> :主流动态集合,开发、面试、考试重点,完全替代 ArrayList。
三、代码对比演示
1. ArrayList(不安全、有装箱拆箱)
ArrayList list = new ArrayList();
list.Add(10); // 装箱
list.Add("张三"); // 混搭类型允许
int num = (int)list[0]; // 必须拆箱转换
2. List<T>(安全、无装箱拆箱)
List<int> list = new List<int>();
list.Add(10);
// list.Add("张三"); // 直接报错,类型不匹配,杜绝类型混乱
int num = list[0]; // 直接使用,无需拆箱
四、终极总结表格(背诵版)
| 对比项 | ArrayList | List<T> |
|---|---|---|
| 泛型 | 非泛型 | 泛型集合 |
| 类型安全 | 不安全,任意类型混搭 | 安全,固定单一类型 |
| 装箱拆箱 | 有,性能低 | 无,性能高 |
| 类型转换 | 取值需要强转 | 无需转换 |
| 使用状态 | 过时、淘汰 | 主流、推荐 |
五、必考一句话简答题
为什么使用 List<T> 替代 ArrayList?
List<T> 是泛型集合,类型安全、无装箱拆箱、性能更高、代码更简洁;而 ArrayList 非泛型、类型不安全、存在装箱拆箱、性能差,因此被 List<T> 完全替代。
数组、ArrayList、List<T> 三者终极对比总表
一、核心总览一句话
数组:长度固定、类型安全、性能最高、不能扩容
ArrayList:动态扩容、非泛型、类型不安全、装箱拆箱、已淘汰
List<T>:动态扩容、泛型安全、无装箱拆箱、性能高、项目主流
二、终极最全对比表(简答题直接默写)
| 对比维度 | 数组 Array | ArrayList(非泛型集合) | List<T>(泛型集合) |
|---|---|---|---|
| 长度特性 | 固定长度,定义后不可改变 | 动态长度,自动扩容 | 动态长度,自动扩容 |
| 类型约束 | 固定单一类型,不能混搭 | object类型,任意类型可混搭 | 泛型约束,固定单一类型 |
| 类型安全性 | 安全 | 不安全(极易类型转换异常) | 绝对安全 |
| 装箱/拆箱 | 无装箱、无拆箱 | 全程装箱、拆箱,性能低 | 无装箱、无拆箱,性能高 |
| 取值方式 | 直接取值,无需转换 | 取值必须强制类型转换 | 直接取值,无需转换 |
| 元素数量属性 | Length(长度) | Count(元素个数) | Count(元素个数) |
| 高阶方法调用 | 静态调用:Array.xxx(数组) | 实例调用:对象.xxx() | 实例调用:对象.xxx() |
| 扩容能力 | 不支持扩容 | 自动扩容 | 自动扩容 |
| 灵活度 | 低(增删麻烦) | 高(增删方便) | 最高(功能最全、最规范) |
| 使用状态 | 基础数据容器,一直使用 | 过时、淘汰、仅考试考察 | 项目主流、官方推荐 |
三、三者迭代关系(必考理解)
数组 → 解决不了动态扩容 → 推出 ArrayList
ArrayList → 类型不安全、装箱拆箱性能差 → 推出 List<T>
结论:List<T> 弥补了数组和ArrayList的所有缺点
四、高频简答题标准答案(直接背诵)
1. 为什么放弃 ArrayList 使用 List<T>?
ArrayList 是非泛型集合,存储 object 类型,任意类型可混搭,类型不安全;存在大量装箱拆箱操作,性能低,取值需要强制转换。List<T> 是泛型集合,类型安全,无装箱拆箱,性能更高,代码简洁规范,因此完全替代 ArrayList。
2. 数组和 List<T> 的区别?
数组长度固定,不可扩容,适合数据量固定场景;List<T> 动态扩容、增删灵活,功能丰富、支持大量高阶方法,适合数据频繁变动场景。数组性能极致,List 开发效率更高。
五、最终选择场景口诀(做题不踩坑)
-
数据固定不变 → 用数组
-
数据频繁增删、动态变化 → 用 List<T>
-
ArrayList 只出现在考题中,项目绝不使用