数组、字符串与集合复习#
对应笔记:数组基础、数组进阶、String 字符串、集合与泛型、泛型、Array 数组方法 建议用时:60 分钟。
一、选择题#
1. int[] arr = new int[5]; 中 arr[0] 的默认值是?
- A. 随机值
- B. 0
- C. null
- D. 编译错误
答案
B. 0。数组初始化后会用该类型的默认值填充:int→0,string→null,bool→false。
2. 数组的索引从几开始?最后一个元素的下标是?
- A. 1;Length
- B. 0;Length-1
- C. 0;Length
- D. 1;Length-1
答案
B。数组下标从 0 开始,最后一个元素是 arr[arr.Length - 1]。
3. Array.Resize(ref arr, 10) 中 ref 的作用是?
- A. 没有作用
- B. 因为 resize 会重新分配内存并替换原引用,必须用 ref
- C. 让数组变成引用类型
- D. 防止数组被修改
答案
B。Resize 会创建新数组并改变变量指向,必须用 ref 才能把新引用传回调用方。
4. 下列哪种集合可以存储不同类型的数据(如 int 和 string 混存)?
- A.
List<int> - B.
Dictionary<string, int> - C.
ArrayList - D.
int[]
答案
C. ArrayList。ArrayList 是非泛型集合,元素是 object 类型,可混存;List\<T> 和数组类型固定。
5. Dictionary<int, string> 通过什么访问数据?
- A. 索引 index
- B. 键 Key
- C. 下标
- D. 随机访问
答案
B。Dictionary 通过 Key 访问 Value:dict[key]。键必须唯一,添加前可用 ContainsKey 判断。
6. 装箱(Boxing)是指?
- A. 引用类型转值类型
- B. 值类型转引用类型(如 int → object)
- C. 字符串转数字
- D. 数组复制
答案
B。装箱:值类型 → object;拆箱:object → 值类型(需强制转换)。装箱拆箱有性能开销,尽量用泛型集合避免。
7. string 是值类型还是引用类型?
- A. 值类型
- B. 引用类型
- C. 两者都是
- D. 都不是
答案
B. 引用类型。string 是引用类型,但具有不可变性——每次修改都会产生新字符串。
二、填空题#
1. 数组声明格式:==_== ==== ==_== ====,如 int[] ints = new int[5];。写了初始值时可以省略 ==_== ==== ==_== ====。
答案
数据类型[] 变量名 = new 数据类型[长度];new 或长度(int[] arr = {1,2,3};)。
2. String.Split(',') 的作用是 ==_== ==== ==_== ====,string.Join("*", arr) 的作用是 ==_== ==== ==_== ====。
答案
按逗号分割字符串为字符串数组;把数组按 * 拼接为字符串(二者互为逆操作)。
3. IndexOf 与 LastIndexOf 的区别是 ==_== ==== ==_== ====。
答案
IndexOf 从前往后找第一个匹配位置;LastIndexOf 从后往前找最后一个匹配位置。
4. ArrayList 的 Add 添加的是 ==_== ==== ==_== ==== 类型,取值时需要 ==_== ==== ==_== ====。
答案
object;拆箱(强制转换)。int n = (int)list[0];
5. List<T> 相比 ArrayList 的优势是 ==_== ==== ==_== ====。
答案
强类型、类型固定,避免了装箱拆箱的性能开销。
6. Dictionary 添加新键值对使用 ==_== ==== ==_== ==== 方法,判断键是否存在使用 ==_== ==== ==_== ====。
答案
Add(key, value);ContainsKey(key)。
三、简答题#
1. 冒泡排序的核心思想是什么?如何优化?
答案
相邻元素两两比较,顺序不对就交换,每一轮把最大(小)值"冒泡"到末尾。优化:内层循环上限 arr.Length - 1 - i,已排好的位置不再比较。
2. 一维数组和二维数组如何遍历?
答案
一维:for (int i = 0; i < arr.Length; i++) 或 foreach。二维:GetLength(0) 取行数、GetLength(1) 取列数,双层 for 循环遍历。
3. StringBuilder 与字符串 + 拼接的区别?(选答)
答案
字符串不可变,大量 + 拼接会产生大量临时字符串,性能差;StringBuilder 在可变缓冲区中拼接,适合循环内大量拼接场景。
四、编程题#
1. 冒泡排序:将数组按从小到大排序。
答案
```csharp
> int[] arr = { 3, 4, 1, 6, 7, 10, 23, 45 }; > for (int i = 0; i < arr.Length; i++) > { > for (int j = 0; j < arr.Length - 1 - i; j++) > { > if (arr[j] > arr[j + 1]) > (arr[j], arr[j + 1]) = (arr[j + 1], arr[j]); // 元组交换 > } > } > ```
2. 生成 10 个 0~9 不重复的随机数(用 List)。
答案
3. 统计一段字符串中每个字符出现的次数(用 Dictionary)。
答案
4. 将字符串数组按 - 拼接后输出,再按 - 拆分回数组。
答案
5. 删除数组(字符串数组)中的重复元素。
答案
6. 用 Array.FindAll 筛选出所有偶数(配合 Lambda)。
答案
知识卡片#
数组与 List 的区别? > 数组长度固定、类型固定;List\<T\> 长度可动态增减,类型固定(泛型)。
ArrayList 与 List\<T\> 的区别? > ArrayList 非泛型,元素为 object,可混存不同类型但需装箱拆箱;List\<T\> 泛型强类型,性能更好。
Split 与 Join 的关系?
Split 按分隔符把字符串拆成数组;Join 按分隔符把数组拼成字符串,互为逆操作。
装箱与拆箱?
装箱:值类型→object;拆箱:object→值类型(强制转换)。有性能开销,优先用泛型集合。
Dictionary 的特点?
键值对存储,通过 Key 快速查找,Key 必须唯一;添加前用 ContainsKey 判断避免重复键异常。
数组的默认值?
初始化后按类型填充默认值:int→0,string→null,bool→false,char→'\0'。
Array 常用方法?
Clear(清除)、Copy(复制)、Reverse(反转)、Sort(排序)、Resize(调整长度)、IndexOf/Find/FindAll(查找)。
字符串常用方法?
Concat 拼接、Contains 包含、StartsWith/EndsWith 开头结尾、IndexOf/LastIndexOf 查找、Split 分割、Join 拼接、Replace 替换、ToUpper/ToLower 大小写、Substring 截取。
相关笔记#
- 数组基础 — 数组基础
- 数组进阶 — 排序与二维数组
- Array 数组方法 — Array 方法
- String 字符串 — 字符串 API
- 集合与泛型 — 集合与泛型
- 泛型 — 泛型深入
- C# 复习总览 — 复习总览