数组、集合和泛型
第8章 泛型

泛型成员的可用方法
n
由于泛型类型只有在类实例化后才能确定,类中 的泛型成员只能使用Object类型中的方法:
class Generic<T>{ T f; void setF(T f){ this.f=f; } //.... void doSome(){ /* getClass和toString都是Object中的方法 */ System.out.println(f.getClass().getName()); System.out.println(f.toString()); } }
定义泛型(Generics)类
n n
n
强类型集合采用了JDK1.5引入的泛型语法。 泛型相当于类中一种特殊的类型,这种类型的特 点是在实例化该类时可指定为某个具体的实际类 型。 声明包含泛型的类的格式如下:
[访问修饰符] class 类名<泛型1,泛型2,…>{ 泛型1 泛型成员1; 泛型2 泛型成员2;
强类型集合示例
//下面的向量类的实例中只能存储字符串类型数据 Vector<String> v=new Vector<String>(); v.add("张三"); //加入的是字符串,OK String name=v.get(0); //取出时,无需做类型转换 /* 如果想在这种强类型集合中加入日期数据,在编译时就 会报告错误 */ v.add(new Date()); //编译器会直接报告类型不匹配错误
public void setF(T f) {//setF方法的参数类型为泛型T this.f = f; } public T getF() {//getF方法的返回类型为泛型T return f; } }
第6章 集合类(黑马程序员版)

接下来通过一个案例来学习这些方法的使用,请查看教材文件6-2。
✎ 6.3 List接口
Iterator接口
在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,JDK专门提 供了一个接口Iterator。Iterator接口也是Java集合中的一员,但它与Collection、 Map接口有所不同,Collection接口与Map接口主要用于存储元素,而Iterator主 要用于迭代访问(即遍历)Collection中的元素,因此Iterator对象也被称为迭代 器。
பைடு நூலகம்
✎ 6.3 List接口
图中,通过两张图描述了LinkedList集合新增元素和删除元素的过程。其中,左 图为新增一个元素,图中的元素1和元素2在集合中彼此为前后关系,在它们之 间新增一个元素时,只需要让元素1记住它后面的元素是新元素,让元素2记住 它前面的元素为新元素就可以了。右图为删除元素,要想删除元素1与元素2之 间的元素3,只需要让元素1与元素2变成前后关系就可以了。由此可见 LinkedList集合具有增删元素效率高的特点。
图中,在调用Iterator的next()方法之前,迭代器的索引位于第一个元素之前,不指 向任何元素,当第一次调用迭代器的next()方法后,迭代器的索引会向后移动一位, 指向第一个元素并将该元素返回,当再次调用next()方法时,迭代器的索引会指向 第二个元素并将该元素返回,依此类推,直到hasNext()方法返回false,表示到达了 集合的末尾,终止对元素的遍历。
☞点击查看本小节知识架构
模拟KTV点歌系统
Set接口
☞点击查看本小节知识架构
模拟新浪微博用户注册
Map接口
☞点击查看本小节知识架构
C#中的泛型和泛型集合

C#中的泛型和泛型集合⼀、什么是泛型?泛型是C#语⾔和公共语⾔运⾏库(CLR)中的⼀个新功能,它将类型参数的概念引⼊.NET Framework。
类型参数使得设计某些类和⽅法成为可能,例如,通过使⽤泛型类型参数T,可以⼤⼤简化类型之间的强制转换或装箱操作的过程(下⼀篇将说明如何解决装箱、拆箱问题)。
说⽩了,泛型就是通过参数化类型来实现在同⼀份代码上操作多种数据类型,利⽤“参数化类型”将类型抽象化,从⽽实现灵活的复⽤。
使⽤泛型给代码带来的5点好处:1、可以做⼤限度的重⽤代码、保护类型的安全以及提⾼性能。
2、可以创建集合类。
3、可以创建⾃⼰的泛型接⼝、泛型⽅法、泛型类、泛型事件和泛型委托。
4、可以对泛型类进⾏约束,以访问特定数据类型的⽅法。
5、关于泛型数据类型中使⽤的类型的信息,可在运⾏时通过反射获取。
例⼦:using System;namespace ConsoleApp{class Program{class Test<T>{public T obj;public Test(T obj){this.obj = obj;}}static void Main(string[] args){int obj1 = 2;var test = new Test<int>(obj1);Console.WriteLine("int:" + test.obj);string obj2 = "hello world";var test1 = new Test<string>(obj2);Console.WriteLine("String:" + test1.obj);Console.ReadKey();}}} 输出结果是: int:2 String:hello world 分析: 1、 Test是⼀个泛型类。
C语言集合的实现

C语言集合的实现C语言是一种通用的程序设计语言,提供了丰富的数据结构和算法库。
在C语言中,集合是一种存储不重复元素的数据结构,常用于需要存储、查询和操作一组不同元素的场景。
本文将介绍C语言中集合的实现方式,并详细解释其原理和应用。
1.集合的定义集合是一种不包含重复元素的容器,没有特定的顺序。
在C语言中,可以使用数组或链表等数据结构来实现集合。
集合通常有以下几个基本操作:插入元素、删除元素、判断元素是否存在、求并集、求交集、求差集等。
2.集合的实现方式2.1使用数组实现集合使用数组实现集合比较简单,只需要定义一个固定大小的数组,然后使用元素的值作为下标来标记元素是否存在。
例如,要存储范围在0-9之间的整数集合,可以定义一个大小为10的数组,数组下标代表元素值,数组元素的值用于表示元素是否存在。
下面是使用数组实现集合的示例代码:```c#define SIZE 10//初始化集合void initSet(int set[])for (int i = 0; i < SIZE; i++)set[i] = 0;}//插入元素void insertElement(int set[], int element) if (element >= 0 && element < SIZE)set[element] = 1;}//删除元素void deleteElement(int set[], int element) if (element >= 0 && element < SIZE)set[element] = 0;}//判断元素是否存在int isElementExist(int set[], int element) if (element >= 0 && element < SIZE)return set[element];} elsereturn 0;}//打印集合void printSet(int set[])for (int i = 0; i < SIZE; i++) if (set[i] == 1)printf("%d ", i);}}int maiint set[SIZE];initSet(set);insertElement(set, 1); insertElement(set, 3); insertElement(set, 5); deleteElement(set, 3);printf("集合中的元素为:"); printSet(set);return 0;```这段代码中,先定义了一个大小为10的数组作为集合的存储空间。
c#程序设计第7章

7.1.2 BitArray集合 向BitArray类的构造函数中传入16个比特位的 数目,这样可以初始化一个BitArray对象:
BitArray BitSet = new BitArray(16)
这个BitArray对象的16个位均被设置为False。 如果要使初值为True,可以用下面的方式初始化
例:BitArray转换为二进制显示
int bits, binary; string[] binNumber = new string[8]; byte[] ByteSet = new byte[] { 3,2,1 }; BitArray BitSet = new BitArray(ByteSet); bits = 0; binary = 7; for (int i = 0; i <= BitSet.Count - 1; i++) { if (BitSet.Get(i) == true) binNumber[binary] = "1"; else binNumber[binary] = "0"; bits++; binary--; if ((bits % 8) == 0) { binary = 7; bits = 0; for (int j = 0; j <= 7; j++) Console.Write(binNumber[j]); Console.WriteLine(); } }
1. ArrayList类的常用方法
方 Add 法 说 明 Adapter 为特定的 IList 创建 ArrayList 包装。 将对象添加到 ArrayList 的结尾处。
AddRange
BinarySearch Clear Clone Contains CopyTo
第六讲 韩顺平Java核心编程 22~26

1.集合框架√2.泛型√3.异常√1.掌握常用的集合类(接口)2.充分理解什么是泛型3.掌握java中的异常■一个问题?前面我们学习了数组,充分体会到数组的优越性,就是可以存储同一类型的数据,但是我们假设有这样的需求,大家看看如何解决?请做一个公司职员薪水管理系统,要求完成如下功能:①当有新员工时,将该员工加入到管理系统①可以根据员工号,显示该员工的信息.②可以显示所有员工信息③可以修改员工的薪水⑤当员工离职时,将该员工从管理系统中删除⑥可以按照薪水从低到高顺序排序【思考题】⑦可以统计员工的平均工资和最低和最高工资.■问题分析当然,我们可以使用数组来解决,可是用数组的话,有什么问题,我们来看看:■解决之道-链表或是集合类我们想,如果有这样一种数组,它可以动态的改变就好了,java的设计者为我们提供了一系列的集合类,我们来看看.■解决之道-链表或是集合类我们想,如果有这样一种数组,它可以动态的改变就好了,java的设计者为我们提供了一系列的集合类,我们来看看.■解决之道-链表或是集合类■使用从上面的图可以看出java集合类主要有以下几种: List结构的集合类ArrayList类, LinkedList类, Vector类,Stack类Map结构的集合类HashMap类,Hashtable类Set结构的集合类HashSet类,TreeSet类Queue结构的集合Queue接口■使用我们给大家举几个案例来看看集合类的常用方法:【Demo6_1.java】和【Demo7_3.java】■具体应用在我们熟悉了一些集合类的基本用法后,我们来解决前面提出的公司职员薪水管理系统。
首先我们使用ArrayList这个集合类.案例【Demo7_2.java】■ArrayList和Vector的区别ArrayList与Vector都是java的集合类,都可以用来存放java对象,这是他们的相同点,但是他们也有区别:一.同步性:Vector是同步的。
数组和集合实例

数组和集合实例using System;using System.Collections;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;namespace ConsoleApplication2{class Program{static void Main(string[] args){int[] arr1 = new int[2] {1,2};int[,] arr2 = new int[2, 3] {{0,1,2 },{2,3,4 }};Console.WriteLine(arr2[1,1]);ArrayListArrayList alt = new ArrayList();alt.Add("123");alt.Add(123);alt.Add(true);bool iscontain = alt.Contains("1");alt.Clear();/*alt.Insert(0, "abc")*/;Console.WriteLine(iscontain);for(int i = 0; i < alt.Count; i++){Console.WriteLine(alt[i].ToString() + " " + alt[i].GetType().ToString());}foreach (var x in alt){Console.WriteLine(x.ToString() + " " + x.GetType().ToString());}泛型集合 ListList<string> str_list = new List<string>();str_list.Add("a");str_list.Add("b");str_list.Add("c");str_list.Add("d");foreach(string x in str_list){Console.WriteLine(x);}哈希表hashtableHashtable ht = new Hashtable();ht.Add("1","a");ht.Add(2, "b");ht.Add(3, false);ht.Add("x", 3.14);Console.WriteLine(ht[2]);foreach(var x in ht.Keys){Console.WriteLine(ht[x]);}字典表 DictionaryDictionary<string, int> dic = new Dictionary<string, int>();dic.Add("a", 3);dic.Add("b", 4);dic.Add("c", 5);dic.Add("d", 6);dic.Add("e", 7);foreach(var x in dic.Keys){Console.WriteLine(x);}队列 queueQueue que = new Queue();que.Enqueue("张三");que.Enqueue("李四");que.Enqueue("王五");que.Enqueue("赵六");Console.WriteLine("现在的长度是" + que.Count);Console.WriteLine(que.Dequeue());Console.WriteLine("现在的长度是" + que.Count);堆栈 stackStack st = new Stack();st.Push("a");st.Push("b");st.Push("c");st.Push("d");Console.WriteLine(st.Count);Console.WriteLine(st.Pop());Console.WriteLine(st.Count);Console.ReadLine();int[] arr1 = new int[2] { 1, 2 };int[,] arr2 = new int[2, 3]{{0,1,2},{2,3,4}};Console.WriteLine(arr2[1, 1]);ArrayList 特点不需要不需要限长度,不需要规定类型,缺点:键值只能是0,1,2,3往后排:ArrayList alt = new ArrayList();alt.Add("123");alt.Add(123);alt.Add(true);alt.Remove(123); 从其中移除 clear 是全部清空的意思bool iscontain=alt.Contains("123"); 看看⾥⾯是否包含"123",如果有就会显⽰"true",如果没有就会显⽰false; alt.Clear(); 全部清除:alt.Insert(0,"abc"); 意思是往 0 位置插⼊⼀个字符串"123";Console.WriteLine(alt);for (int i = 0; i < alt.Count;i++ ) {Console.WriteLine(alt[i].ToString()+" "+alt[i].GetType().ToString());}var类型是万能类型foreach(var x in alt){Console.WriteLine(x.ToString()+" "+alt[i].GetType().ToString)}泛型集合 list 需要规定类型,不需要规定长度也不⾏规定键值也是从0,1,2,3开始排List<string> str_list = new List<string>();str_list.Add("a");str_list.Add("b");str_list.Add("c");str_list.Add("d");foreach (string x in str_list) {Console.WriteLine(x);}哈希表hashtable 不错在顺序的概念Hashtable ht = new Hashtable();ht.Add("1", "a");ht.Add(2, "b");ht.Add(3, false);ht.Add("x", 3.14);//Console.WriteLine(ht[2]);foreach (var x in ht.Values) {Console.WriteLine(x);}foreach (var x in ht.Keys){Console.WriteLine(x); //取全部的值Console.WriteLine(ht[x]);}字典表 DictionaryDictionary<string, int> dic = new Dictionary<string, int>();dic.Add("a", 3);dic.Add("b", 4); 前⾯的是key键后⾯的是value值dic.Add("c", 5);dic.Add("d", 6);dic.Add("e", 7);dic.Add("f", 8);foreach (var x in dic.Keys) {Console.WriteLine(x);}队列 queue 先进先出Queue que = new Queue();que.Enqueue("张三");que.Enqueue("李四");que.Enqueue("王五");que.Enqueue("赵六");Console.WriteLine("现在的长度是" + que.Count);Console.WriteLine(que.Dequeue()); //dequeue()函数⽤于移除每个匹配元素的指定队列中的第⼀个函数,并执⾏被移除的函数。
待办事项java课程设计

待办事项java 课程设计一、课程目标知识目标:1. 学生能理解Java中待办事项应用的基本概念,掌握使用类和对象来表示待办事项。
2. 学生能够运用集合框架管理一组待办事项,了解数组列表和泛型集合的使用场景。
3. 学生能够掌握基本的异常处理,保证程序的稳定运行。
技能目标:1. 学生能够独立编写和调试Java程序,实现待办事项的增加、删除、查询和修改功能。
2. 学生通过本课程学习,能够掌握基本的编程规范,编写出结构清晰、易于维护的代码。
3. 学生能够运用所学知识,结合实际问题,设计出合理的算法和数据结构解决待办事项的管理问题。
情感态度价值观目标:1. 培养学生积极思考、主动探究的学习态度,增强解决问题的自信心。
2. 通过团队协作,培养学生的沟通能力和团队精神,理解合作的重要性。
3. 培养学生关注生活、发现生活中的问题,并尝试用编程解决问题的意识。
本课程针对高年级学生,结合Java学科特点,注重理论与实践相结合,培养学生的编程能力和实际应用能力。
课程目标旨在使学生能够掌握Java编程的基本知识,提高解决问题的技能,同时培养良好的情感态度价值观,为后续学习打下坚实基础。
二、教学内容1. 类与对象:介绍待办事项的概念,学习如何用Java类表示待办事项,包括属性(如标题、描述、截止日期)和方法(如完成状态切换)。
2. 集合框架:学习Java集合框架,特别是ArrayList和泛型集合List,用于存储和管理一组待办事项。
3. 异常处理:介绍异常处理的基本概念,学习如何处理运行时异常,保证程序在遇到错误时能够给出合适的反馈。
4. 编程规范:回顾和强化Java编程规范,包括命名规范、代码组织、注释使用等,提高代码的可读性和可维护性。
5. 算法与数据结构:设计简单算法实现待办事项的增加、删除、查询和修改功能,讨论不同数据结构对待办事项管理效率的影响。
教学内容安排和进度:- 第一课时:介绍待办事项概念,学习类与对象的基本知识,创建一个简单的待办事项类。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.1 数组的概念
数组具有以下属性: (1)数组可以是一维、多维或交错的。 (2)数值数组元素的默认值设置为零,而引用元
素的默认值设置为 null。 (3)交错数组是数组的数组,因此,它的元素是
引用类型,初始化为 null。 (4)数组的索引(序号)从零开始:具有 n 个元
素的数组的索引是从 0 到 n-1。 (5)数组元素可以是任何类型,包括数组类型。
第4章 数组、集.4 4.5 4.6 4.7 4.8 4.9
数组的概念 声明、创建数组 初始化数组变量 遍历数组元素 多维数组 交错数组 隐式类型数组 集合与集合接口 泛型集合
27 五月 2020
4.1 数组的概念
在程序设计过程中,经常出现同一种类型的数
数组的遍历一般通过循环实现,利用元素序号的有 规律变化,访问到数组中的每一个元素。
27 五月 2020
4.4 遍历数组元素
数组的遍历除了可以用for形式的循环实现外,还可 以通过while或do while形式的循环完成,此外,还可以 使用foreach形式完成,foreach语句提供一种简单、明 了的方法来循环访问数组的元素。与for相比,foreach只
门课程的多维数组代码为: float[,] studentsGrades = new float[35, 5];
27 五月 2020
4.2 声明、创建数组
对于交错数组,则可以在第一次创建过程中指定外层 数组元素的个数,每个数组元素所对应的数组中所包含元 素的个数可以在后继代码中指定,如以下示例。
", "赵六", "丁七" };
此数组中元素值分别为“张三”、“李四”、“王五”、“赵六 ”和“丁七”,同时,由于在初始化时,只提供了5个元素,所 以数组的大小被确定为5。
此代码也可以写成: string[ ]studentsName = new string[5]{ "张三", "李四", "王
27 五月 2020
4.2 声明、创建数组
例如,需要声明一个用于记录多名学生姓名的数组变量, 由于所有学生姓名都可以分别用一个字符串变量来记录, 那么记录多名学生姓名的数组变量声明如下:
string[ ] studentsName; 声明一个记录多名学生某一门课程考试成绩的数组变量,
由于学生考试成绩可用float类型变量来记录,那么记录 多名学生成绩的数组变量声明如下: float[ ] studentsGrade;
27 五月 2020
4.3 初始化数组变量
如果上例中,完成初始化后,数组元素的值分别对应为: studentsName[0] — 张三 studentsName[1] — 李四 studentsName[2] — 王五 studentsName[3] — 赵六 studentsName[4] — 丁七 要修改原名为“张三”的数组元素的值为“张飞”,则代码为: //第0号元素的值被修改为“张飞” studentsName[0] = "张飞"; 要读取最后一个学生(也就是第4个元素)的姓名,则代码为: //第4号元素的值读取后赋值到变量lastStudentName中 string lastStudentName = student[4];
27 五月 2020
27 五月 2020
4.2 声明、创建数组
由于实际应用中,需要记录学生的多门课程成绩, 每个学生的所上课程都一样,如果把学生的各门课程成绩 分别记录在不同的数组中,则可能无法确定同一学生的多 门课程成绩能一一对应,此时可以用多维数组实现,由于 所有课程的成绩都是小数,所以记录多名学生的多门课程 成绩的数组变量声明如下:
变量,同时完成了数组变量自身的初始化。 //创建一个最多能保存5个学生姓名的数组 string[ ]studentsName = {“张三”, “李四”, “王五”, “赵六
”, “丁七”};
此时,数组对象可以被访问,但数组元素却没有明确进行 初始化,所以所有35个学生姓名都被初始化为string类 型的默认值,其值为空,即字符串长度为0。
能顺序访问数组元素,并且只能访问不能赋值。
foreach的通用语法格式为:
foreach (数据类型 当前变量 in 集合对象)
{
//处理代码
}
其中的集合对象在数组的应用中就是数组对象,如果需要
提交结束遍历而不处理其余部分元素时,可以通过break 语句跳出foreach代码块,其用法与循环中的break相同。
//声明并创建一个交错数组,数组大小为6,数组中 这6个元素分别是一个int类型的数组,但这6个数组的大 小还未确定。
int[ ][ ] jaggedArray = new int[6][ ];
27 五月 2020
4.2 声明、创建数组
在确定数组中的元素值时,也可以在创建数组元素的同时设置数
float[ , ] studentsGrades;
27 五月 2020
4.2 声明、创建数组
在某些特殊情况下,数组中的元素本身也需要记录 多个类型相同的数据,但数组中的元素并不是包含有相同 数量的多个类型相同的数据,此时就可以使用交错数组, 交错数组又叫做数组的数组。在上例中,如果学生所上课 程门数不一样,如果需要记录所有学生的所有成程,目前 可用交错数组,声明变量如下:
4.2 声明、创建数组
和其他数据类型一样,数组对象在使用前必须先声明 和创建。数组是使用类型声明的,一维数组、多维数组和 交错数组的声明和创建方式稍有不同。
一维数组的声明格式为:数据类型[ ] 数组对象名称; 多维数组的声明格式为:数据类型[ , ] 数组对象名称; 交错数组的声明格式为:数据类型[ ] [ ] 数组对象名称; 其中的数据类型可以是任何C#的合法数据类型。
数组元素进行访问是通过数组名称及此元素在数组中的序号来实 现,其语法格式为:
数组名称[ 元素在数组中的序号] 注意:元素在数组中的序号是从0开始计数,最后元素的序号为
数组长度-1。
数组元素变量的值可以被读,也可以被写,如果数组元素在赋值 符号的左侧,则是对数组元素进行赋值(写)操作,否则是读取 数组元素的值。
27 五月 2020
4.3 初始化数组变量
下例中创建了一个能保存35个学生姓名的数组变量,同 时完成了数组变量自身的初始化。
//创建一个最多能保存35个学生姓名的数组 string[ ]studentsName = new string[35]; 下例中用另一格式创建了一个能保存5个学生姓名的数组
27 五月 2020
4.3 初始化数组变量
数组变量在创建后,还必须先初始化才能被访问。 数组变量在初始化时需要注意,数组变量自身是一个变量,
数组中所包含的所有元素也是变量,数组变量和数组元素 所对应的变量可分别进行初始化。 在上一节中创建数组的同时,实际上就是对数组变 量进行了初始化,但数据元素则不一定同时完成了初始化。 对于数据元素的数据类型为int、float、string等基本数 据类型的数组,其数据元素在数组变量创建的同时完成初 始化,数据元素的值被初始化为对应类型的默认初始值。
27 五月 2020
4.5 多维数组
数组可以具有多个维度,就象现实世界可以有二维 空间、三维空间一样,对应的称为二维数组、三维数组等。 二维数组可以被看成为多行多列的多个元素组成,行数即 是第0维的长度,列数即为第1维的长度。
多维数组的使用与一维数组的基本一致,只是访问 数组元素时,必须指定元素在每一维中的序号。
据需要进行统一管理和操作的情况,例如:同一个 班级中有多名学生,班级内的所有学生信息需要统 一进行统计、排序等操作。为方便实现这些对同一 类型数据的处理,可以使用数组这一数据结构。数 组(array)是一种数据结构,是一个包含相同数 据类型的数据的集合,可以通过数值索引来访问其 中的所有数据成员(数组元素)。C#中的数组一般 分为:一维数组、多维数组和交错数组,此外还有 特殊隐式类型数组。
27 五月 2020
4.3 初始化数组变量
以下代码则完成了数组变量和数组元素的初始化,各数组元素被 明确的赋给了指定的值:
//创建一个最多能保存5个学生姓名的数组,同时对这5个学生 姓名进行赋值
string[ ]studentsName = new string[]{ "张三", "李四", "王五 ", "赵六", "丁七" };
五", "赵六", "丁七" };
27 五月 2020
4.2 声明、创建数组
注意:其中指定的数组大小必须正好等于大括号中
指定的元素初始值的个数,否则编辑将出错。此情况的推 荐写法是不指定数组大小,而是由元素个数自动确定数组 大小,否则在代码进行修改后,可能反而出现语法错误。 例如前例中,虽然指定数组大小为5同样正确,但如果程 序根据实际需要,“丁七”不再是此数组中的成员,则修 改代码时删除此初始值,代码如下: string[ ]studentsName = new string[5]{ "张三", "李四 ", "王五", "赵六"};//仅删除丁七值 则由于初始化只提供了4个数组元素,与指定的数组 大小不一致,则出现语法错误,错误提示为:无效的秩说 明符: 应为“,”或“]”。
4.2 声明、创建数组
数组具有以下属性: (1)数组可以是一维、多维或交错的。 (2)数值数组元素的默认值设置为零,而引用元
素的默认值设置为 null。 (3)交错数组是数组的数组,因此,它的元素是