1、面向对象的程序设计第第 6 章章 数组和集合类数组和集合类 对外经济贸易大学信息学院对外经济贸易大学信息学院面向对象的程序设计对外经济贸易大学 雷擎content6.1 数组数组6.2 集合框架集合框架6.3 枚举类型枚举类型实验:数组实验:数组面向对象的程序设计对外经济贸易大学 雷擎6.1 数组数组o 6.1.1 数组的声明数组的声明o 6.1.2 数组的创建数组的创建o 6.1.3 数组元素的初始化数组元素的初始化o 6.1.4 数组的引用数组的引用o 6.1.5 二维数组二维数组o 6.1.6 数组的排序数组的排序面向对象的程序设计对外经济贸易大学 雷擎数组的概念数组的概念o 数组由同一
2、类型的一连串对象或基本数据组数组由同一类型的一连串对象或基本数据组成,封装在同一个标识符(数组名称)下。成,封装在同一个标识符(数组名称)下。o 数组是对象数组是对象n 动态初始化动态初始化n 可以赋值给可以赋值给Object类型的变量类型的变量n 在数组中可以调用类在数组中可以调用类Object 的所有方法的所有方法面向对象的程序设计对外经济贸易大学 雷擎o 数组中的变量被称作数组的元素数组中的变量被称作数组的元素o 元素没有名字,通过数组名字和非负整数下元素没有名字,通过数组名字和非负整数下标值引用数组元素。标值引用数组元素。o 每个数组都有一个由每个数组都有一个由 public fina
3、l 修饰的修饰的成员变量:成员变量:length,即数组含有元素的个,即数组含有元素的个数(数(length可以是正数或零)可以是正数或零)数组元素数组元素面向对象的程序设计对外经济贸易大学 雷擎6.1.1 数组的声明数组的声明o 声明(声明(Declaration)n Type arrayName;或者或者n Type arrayName;n 声明数组时无需指明数组元素的个数,也不为数组声明数组时无需指明数组元素的个数,也不为数组元素分配内存空间元素分配内存空间n 不能直接使用,必须经过初始化分配内存后才能使不能直接使用,必须经过初始化分配内存后才能使用用面向对象的程序设计对外经济贸易大学
4、雷擎数组声明的例子数组声明的例子n 例如:例如:n int myIntArray;n String myStringArray;n Circle myCircleArray;面向对象的程序设计对外经济贸易大学 雷擎6.1.2 数组的创建数组的创建arrayName=new Typecomponets number;n 用关键字用关键字new构成数组的创建表达式,可以指构成数组的创建表达式,可以指定数组的类型和数组元素的个数。元素个数可定数组的类型和数组元素的个数。元素个数可以是常量也可以是变量以是常量也可以是变量 n 基本类型数组的每个元素都是一个基本类型的基本类型数组的每个元素都是一个基本类
5、型的变量;引用类型数组的每个元素都是对象的的变量;引用类型数组的每个元素都是对象的的引用引用 面向对象的程序设计对外经济贸易大学 雷擎数组创建的例子数组创建的例子o 例如:例如:int ai;aI=new int10;String aS;aS=new String3;Circle aC;aC=new Circle5o 或者可以将数组的声明和创建一并执行或者可以将数组的声明和创建一并执行int ai=new int10;o 可以在一条声明语句中创建多个数组可以在一条声明语句中创建多个数组 String s1=new String3,s2=new String8;面向对象的程序设计对外经济贸易大学
6、 雷擎6.1.3 数组元素的初始化数组元素的初始化o 数组元素的类型与声明的数组数据类型保持数组元素的类型与声明的数组数据类型保持一致,每一个数组元素都相当于一个变量,一致,每一个数组元素都相当于一个变量,进行需要对象初始化。进行需要对象初始化。o 基本类型的数组,可以在声明数组名时,给基本类型的数组,可以在声明数组名时,给出了数组的初始值。程序便会利用数组初始出了数组的初始值。程序便会利用数组初始值创建数组并对它的各个元素进行初始化值创建数组并对它的各个元素进行初始化。例如:。例如:int a=22,33,44,55;面向对象的程序设计对外经济贸易大学 雷擎6.1.3 数组元素的初始化数组元
7、素的初始化o 创建数组的时,如果没有指定初始值,数组创建数组的时,如果没有指定初始值,数组便被赋予默认值初始值。便被赋予默认值初始值。n 基本类型数值数据,默认的初始值为基本类型数值数据,默认的初始值为0;n boolean类型数据,默认值为类型数据,默认值为false;n 引用类型元素的默认值为引用类型元素的默认值为null。o 程序也可以在数组被构造之后改变数组元素程序也可以在数组被构造之后改变数组元素值值面向对象的程序设计对外经济贸易大学 雷擎数组元素初始化的例子数组元素初始化的例子int aI;aI=new int10;String aS;aS=new String3;Circle a
8、C;aC=new Circle5;int k=0;for(k=0;k10;k+)aIk=k*k;aS0=aaa;aS1=new String(bbb);aS3=new String(ccc);for(k=0;k5;k+)aCk=new Circle();面向对象的程序设计对外经济贸易大学 雷擎6.1.4 数组的引用数组的引用 arrayName index o 数组下标限制数组下标限制n 下标从零开始计数,最大值为下标从零开始计数,最大值为 length 1,如果超过最大值,将会产生数组越界异常(如果超过最大值,将会产生数组越界异常(ArrayIndexOutOfBoundsException
9、)n 必须是必须是 int,short,byte,或者或者 char.o 元素的个数即为数组的长度,可以通过元素的个数即为数组的长度,可以通过 arrayName.length引用引用面向对象的程序设计对外经济贸易大学 雷擎public class MyArray public static void main(String args)int myArray;/声明数组声明数组 myArray=new int10;/创建数组创建数组 System.out.println(IndexttValue);for(int i=0;imyArray.length;i+)System.out.printl
10、n(i+tt+myArrayi);/证明数组元素默认初始化为证明数组元素默认初始化为0 /myArray10=100;/将产生数组越界异常将产生数组越界异常 数组引用例子数组引用例子面向对象的程序设计对外经济贸易大学 雷擎数组变量名是一个引用数组变量名是一个引用public class AA public static void main(String args)int a1=1,2,3,4,5;int a2;a2=a1;for(int i=0;i a2.length;i+)a2i+;for(int i=0;i a1.length;i+)System.out.println(a1+i+=+a1
11、i);面向对象的程序设计对外经济贸易大学 雷擎6.1.5 二维数组二维数组o 二维数组的声明二维数组的声明Type arrayName;或者或者Type arrayName ;o 二维数组的创建二维数组的创建arrayName=new Typelength1length2面向对象的程序设计对外经济贸易大学 雷擎二维数组例子二维数组例子n int a1;o myArray 可以存储一个指向可以存储一个指向2维整数数组的引用维整数数组的引用。其初始值为。其初始值为null。n int a2=new int35;o 建立一个数组对象,把引用存储到建立一个数组对象,把引用存储到myArray。这。这个
12、数组所有元素的初始值为零。个数组所有元素的初始值为零。n int a3=8,1,2,2,9,1,9,4,3,7;o 建立一个数组并为每一个元素赋值。建立一个数组并为每一个元素赋值。面向对象的程序设计对外经济贸易大学 雷擎二维数组的长度二维数组的长度public class AA public static void main(String args)int a3=1,2,3,3,4,5,6,7,8;System.out.println(a3.length);System.out.println(a30.length);System.out.println(a31.length);System.
13、out.println(a32.length);运行结果3324面向对象的程序设计对外经济贸易大学 雷擎二维数组的实现过程二维数组的实现过程int myArray;myArray=new int3 ;myArray0=new int3;int x=0,2;int y=0,1,2,3,4;myArray1=x;myArray2=y;面向对象的程序设计对外经济贸易大学 雷擎6.1.6 数组的排序数组的排序o 在在java的的API里面实现了数组排序功能。里面实现了数组排序功能。在在java.util.Arrays类有静态方法类有静态方法sort就就是实现这个功能。是实现这个功能。面向对象的程序设计
14、对外经济贸易大学 雷擎public class Test6_5 public static void main(String args)Student ss=new Student new Student(1,iven),new Student(2,tom),new Student(3,rose),new Student(3,jone);Arrays.sort(ss);for(int i=0;i ss.length;i+)System.out.println(ssi);面向对象的程序设计对外经济贸易大学 雷擎6.2 集合框架集合框架o 6.2.1 集合框架接口集合框架接口o 6.2.2 Col
15、lection接口接口o 6.2.3 List接口接口o 6.2.4 Set接口接口o 6.2.5 Map接口接口o 6.2.6 Collection和和Arrayso 6.2.7 泛型泛型面向对象的程序设计对外经济贸易大学 雷擎集合框架集合框架o Java语言的设计者对常用的数据结构和算语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现法做了一些规范(接口)和实现(具体实现接口的类)。所有抽象出来的数据结构和算接口的类)。所有抽象出来的数据结构和算法统称为法统称为Java集合框架(集合框架(Java Collection Framework)面向对象的程序设计对外经济贸易
16、大学 雷擎面向对象的程序设计对外经济贸易大学 雷擎6.2.1 集合框架接口集合框架接口o Java语言的设计者对常用的数据结构和算语言的设计者对常用的数据结构和算法做了一些规范(接口)和实现(具体实现法做了一些规范(接口)和实现(具体实现接口的类)。所有抽象出来的数据结构和算接口的类)。所有抽象出来的数据结构和算法统称为法统称为Java集合框架(集合框架(Java Collection Framework)面向对象的程序设计对外经济贸易大学 雷擎6.2.1 集合框架接口集合框架接口o Java2中的集合框架提供了一套设计优良中的集合框架提供了一套设计优良的接口和类,使程序员操作成批的数据或对的
17、接口和类,使程序员操作成批的数据或对象元素极为方便。象元素极为方便。o 这些接口和类有很多对抽象数据类型操作的这些接口和类有很多对抽象数据类型操作的API,而这是我们常用的且在数据结构中熟,而这是我们常用的且在数据结构中熟知的。例如知的。例如Maps,Sets,Lists,Arrays 等。等。面向对象的程序设计对外经济贸易大学 雷擎几种标准的集合接口简化结构几种标准的集合接口简化结构面向对象的程序设计对外经济贸易大学 雷擎6.2.2 Collection接口接口o Collection是最基本的集合接口,一个是最基本的集合接口,一个Collection代表一组代表一组Object,即,即Co
18、llection的元素(的元素(Elements)。)。o 所有实现所有实现Collection接口的类都必须提供两个接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建标准的构造函数:无参数的构造函数用于创建一个空的一个空的Collection,有一个,有一个 Collection参参数的构造函数用于创建一个新的数的构造函数用于创建一个新的Collection,这个新的这个新的Collection与传入的与传入的Collection有有相同的元素。相同的元素。面向对象的程序设计对外经济贸易大学 雷擎迭代子迭代子o 不论不论Collection的实际类型如何,它都支持的实际类型如何,
19、它都支持一个一个iterator()的方法,该方法返回一个迭的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问代子,使用该迭代子即可逐一访问Collection中每一个元素中每一个元素Iterator it=collection.iterator();/获得获得一个迭代子一个迭代子 while(it.hasNext()Object obj=it.next();/得到下一个元素得到下一个元素 面向对象的程序设计对外经济贸易大学 雷擎6.2.3 List接口接口o List是有序的是有序的Collection,使用此接口能,使用此接口能够精确的控制每个元素插入的位置。够精确的控制每个元素插入的
20、位置。o 用户能够使用索引(元素在用户能够使用索引(元素在List中的位置)中的位置)来访问来访问List中的元素中的元素。o List允许有相同的元素。允许有相同的元素。面向对象的程序设计对外经济贸易大学 雷擎o 除了具有除了具有Collection接口必备的接口必备的iterator()方法外,方法外,List还提供一个还提供一个 listIterator()方法,返回一个方法,返回一个ListIterator接口,和标准的接口,和标准的Iterator接接口相比,口相比,ListIterator多了一些多了一些 add()之之类的方法,允许添加,删除,设定元素,还类的方法,允许添加,删除
21、,设定元素,还能向前或向后遍历。能向前或向后遍历。o 实现实现List 接口的常用类有接口的常用类有LinkedList、ArrayList、Vector 和和Stack。面向对象的程序设计对外经济贸易大学 雷擎6.2.4 Set接口接口o Set是一种不包含重复的元素的是一种不包含重复的元素的Collectiono Set接口的常用具体实现有接口的常用具体实现有HashSet和和 TreeSet类类面向对象的程序设计对外经济贸易大学 雷擎6.2.5 Map接口接口o Map接口不是接口不是Collection接口的继承。接口的继承。o Map接口用于维护键和值。该接口描述了接口用于维护键和值
22、。该接口描述了从不重复的键到值的映射。从不重复的键到值的映射。o 一个一个Map中不能包含相同的键,每个键只中不能包含相同的键,每个键只能映射一个值。能映射一个值。面向对象的程序设计对外经济贸易大学 雷擎o Map接口其特点是元素是成对出现的,以接口其特点是元素是成对出现的,以键和值的形式体现出来,键要保证唯一性:键和值的形式体现出来,键要保证唯一性:常用类有:常用类有:HashMap、Hashtable、TreeMap。面向对象的程序设计对外经济贸易大学 雷擎6.2.6 Collections和和Arrayso 两个类提供了封装器实现、数据结构算法和两个类提供了封装器实现、数据结构算法和数组
23、相关的应用。数组相关的应用。n Collections 类中定义了多种集合操作方法,类中定义了多种集合操作方法,实现了对集合操作方法,实现了对集合元素的实现了对集合操作方法,实现了对集合元素的排序、取极值、排序、取极值、批量拷贝、集合结构转换、循批量拷贝、集合结构转换、循环移位以及匹配性检查等功能环移位以及匹配性检查等功能n Arrays类是对数组进行操作的工具类。可以用类是对数组进行操作的工具类。可以用一个数组生成一个对应的一个数组生成一个对应的List(asList),可),可以对数组元素进行排序(以对数组元素进行排序(sort)、查找()、查找(binarySearch)、比较)、比较(
24、equals)、填充)、填充(fill),等等。),等等。面向对象的程序设计对外经济贸易大学 雷擎6.2.7 泛型泛型o 泛型的本质就是将所操作的数据类型参数化泛型的本质就是将所操作的数据类型参数化,也就是说,该数据类型被指定为一个参数,也就是说,该数据类型被指定为一个参数。o 在在Java中泛型主要是用来构建安全的集合中泛型主要是用来构建安全的集合面向对象的程序设计对外经济贸易大学 雷擎6.3 枚举类型枚举类型o 举类型是一个常量集合的数据类型。因为都举类型是一个常量集合的数据类型。因为都是常量,所以一个枚举类型中的字段名都要是常量,所以一个枚举类型中的字段名都要大写。在大写。在JAVA中,
25、枚举类型的定义是通过中,枚举类型的定义是通过“enum”关键字进行的。关键字进行的。面向对象的程序设计对外经济贸易大学 雷擎小结小结6.1 数组数组6.2 集合框架集合框架6.3 枚举类型枚举类型面向对象的程序设计对外经济贸易大学 雷擎实验:数组实验:数组o 实验实验10:数组:数组BACK面向对象的程序设计对外经济贸易大学 雷擎知识点提示:知识点提示:o 理解理解n 数组是同类型对象的集合数组是同类型对象的集合n 数组的元素是对象数组的元素是对象n 数组均需要声明、初始化后才能使用数组均需要声明、初始化后才能使用o 掌握掌握n 数组的定义、初始化和使用数组的定义、初始化和使用面向对象的程序设计End of Chapter 6