一、ArrayList 四大核心接口(理解/了解)
ArrayList 实现四大接口:IList、ICollection、IEnumerable、ICloneable
-
IList:负责列表核心操作 → 增、删、改、查索引、判断包含元素
-
ICollection:负责集合基础属性 → 统计个数、复制拷贝(CopyTo)
-
IEnumerable :负责枚举遍历 → 实现迭代器,支持 foreach 循环
-
ICloneable :负责克隆复制 → 提供 Clone() 浅拷贝,和 CopyTo 有本质区别
二、ArrayList VS 普通数组 int\[\](四大核心区别|简答题满分)
1. 长度特性区别
-
int\[\] 数组 :定义后 长度固定,不可扩容
-
ArrayList 集合 :动态长度,可随意增删元素,自动扩容
2. 存储类型区别
-
int\[\] 数组 :只能存储 单一固定类型,类型安全
-
ArrayList :全部存储 object 父类类型,可以存放任意类型(int、bool、string、对象)
3. 装箱拆箱区别(性能考点)
-
int\[\] :直接存储值类型,无装箱、无拆箱,性能高
-
ArrayList :添加值类型自动装箱 ,取出值类型必须拆箱,性能低
4. 类型安全性区别
-
int\[\] :类型严格固定,类型安全
-
ArrayList :任意类型混存,类型不安全(后期被 List<T> 泛型集合替代)
代码佐证
// 任意类型混搭,ArrayList 专属特点
ArrayList list = new ArrayList() { 1, 2, 3, true, "ss", new object() };
三、继承关系区别
-
int\[\] 数组:int\[\] → Array → Object
-
ArrayList 集合:直接继承 Object
四、ArrayList 全套常用 API(逐行精讲)
1. Add() 单个添加 + 装箱原理
list1.Add(1);
值类型 int 存入 object集合 → 自动装箱(值类型转引用类型)
2. 取值 + 拆箱原理
Console.WriteLine((int)list1[0]);
object 取出转回 int值类型 → 手动拆箱
3. AddRange() 批量添加
可以批量添加 数组 / 其他集合
list1.AddRange(ages); // 添加数组
list1.AddRange(list); // 添加集合
4. Contains() 包含判断
判断集合是否存在指定元素,返回 bool
Console.WriteLine(list1.Contains(1));//true
5. IndexOf / LastIndexOf 索引查询
-
IndexOf:正序查找第一个匹配元素索引
-
LastIndexOf:倒序查找最后一个匹配元素索引
6. 移除方法(两个必区分)
-
Remove(元素):移除指定内容的元素
-
RemoveAt(下标):移除指定索引位置的元素
7. Insert / InsertRange 插入
-
Insert(下标,元素):指定位置插入单个元素
-
InsertRange(下标,集合/数组):指定位置批量插入
8. Clear() 清空集合
清空所有元素,集合长度归零
9. Reverse() 反转集合顺序
颠倒集合元素排列顺序
五、GetRange / SetRange 重难点(高频报错坑点)
1. GetRange(起始下标, 截取长度)
从原集合截取一段数据,返回子集视图(不是独立新集合)
2. SetRange(起始下标, 新数据源)
覆盖原集合指定范围的数据
3. 致命坑点(必考)
GetRange 获取的子集是原集合的视图,不是独立列表
一旦原集合使用 SetRange / Remove 等修改操作,子集视图直接失效,遍历报错
六、CopyTo 与 Clone 终极区别(结合ICloneable接口|压轴考点)
1. CopyTo(ICollection 接口方法)
-
属于 实例方法
-
无返回值
-
必须提前手动创建目标数组/集合(要有足够空间)
-
值类型:等效深度复制,两个集合完全独立
2. Clone(ICloneable 接口方法)
-
属于 实例方法
-
自动返回新集合对象,无需手动创建容器
-
固定为 浅拷贝
-
引用类型元素只会复制地址,新旧集合共享同一对象
3. 极简区分口诀
-
CopyTo:自己准备容器,复制进去
-
Clone:自动生成新容器,浅拷贝返回
七、遍历方式
-
for循环:依靠 集合.Count(数组是.Length)
-
foreach循环:依靠 IEnumerable 可枚举接口,直接遍历
八、考前终极速记口诀
-
数组固定长度类型单一,集合动态扩容万物可装
-
数组安全无装箱,集合混搭装箱拆箱性能差
-
四大接口各司职,增删查改IList,拷贝ICollection
-
遍历全靠可枚举,克隆专属浅拷贝
-
GetRange是视图,原集合修改子集直接报废
-
CopyTo需自备容器,Clone自动生成新集合
------------------------List<T> 泛型集合------------------------
一、List<T> 核心本质(必考定义)
List<T> 是泛型动态集合
-
T:代表任意指定数据类型(int、string、自定义类)
-
约束:只能存储相同类型数据,类型高度安全
-
无装箱、无拆箱,性能远优于 ArrayList
-
长度动态可变,无需像数组一样固定长度
基础创建语法
// 空集合
List<int> list = new List<int>();
// 初始化带元素集合
List<string> list1 = new List<string> { "李张三", "李四" };
核心属性
集合元素个数:集合.Count
区别:数组是 数组.Length
Console.WriteLine(list1.Count);
二、List<T> 全套增删改查 API
1. 添加元素
-
Add():添加单个元素
-
AddRange():批量添加(支持数组、List集合)
list1.Add("1");
list1.AddRange(new List{ "王五" });
2. 移除元素(三种移除方式)
-
Remove(元素):移除匹配到的第一个指定元素
-
RemoveAt(索引):移除指定下标位置的元素
-
RemoveAll(Lambda) :高阶方法,移除所有满足条件的元素,返回值为【移除的元素个数】
list1.Remove("1");
list1.RemoveAt(0);
// 移除所有以"李"开头的元素,返回移除数量
Console.WriteLine(list1.RemoveAll(v => v.StartsWith("李")));
3. 修改元素
通过索引直接赋值修改
list1[2] = "焦恩俊";
4. 插入元素
-
Insert(索引,元素):在指定下标插入单个元素,后续元素后移
-
无 InsertRange 也可通过 AddRange/拼接实现批量插入
list1.Insert(4, "何家劲");
5. 查询方法
-
IndexOf(元素):获取第一个匹配元素的索引,无匹配返回-1
-
Contains(元素):判断是否包含指定元素,返回 bool
list1.IndexOf("1");
list1.Contains("李四");
三、List 与 数组 高阶方法核心区别(超级重点)
数组:静态类方法 ------ Array.xxx(数组,参数)
List:实例对象方法 ------ 集合对象.xxx(参数)
功能基本一致,只是调用方式不同
List 常用高阶方法
// 高阶遍历
list1.ForEach(x => Console.WriteLine(x));
// 条件删除
list1.RemoveAll(v=>v.Length>2);
// 条件判断、查询和数组完全一致
list1.Any();
list1.All();
list1.Find();
list1.FindAll();
四、List<T> 遍历方式
1. foreach 遍历(最常用)
foreach (var i in list1)
{
Console.WriteLine(i+"-------");
}
2. for 遍历
for (int i = 0; i < list1.Count; i++)
{
Console.WriteLine(list1[i]);
}
五、终极考点总结(背诵版)
-
List<T> 泛型集合,类型安全、无装箱拆箱、性能高
-
动态长度,优于固定长度数组,全面替代 ArrayList
-
元素个数:集合Count,数组Length
-
RemoveAll 是高阶方法,可条件删除,返回移除个数
-
数组高阶是【类名调用】,List高阶是【对象调用】
-
支持增删改查、插入、批量添加、条件筛选全套操作