Java应用开发与实践-第5章集合与泛型.ppt
Java应用开发与实践第第二二部分部分 酒店管理系统的设计酒店管理系统的设计学习目标学习目标l 了解集合框架的构成了解集合框架的构成l 了解了解Collection接口及常用子接口接口及常用子接口l 掌握掌握List接口及实现类的用法接口及实现类的用法l 了解了解Set接口及实现类的用法接口及实现类的用法l 掌握掌握Map接口及实现类的用法接口及实现类的用法l 了解泛型的意义了解泛型的意义l 理解在类和接口中的应用理解在类和接口中的应用n 5.1 集合框架集合框架n 5.2 泛型泛型n 5.3 实训实训5 集合实现类的基础练习集合实现类的基础练习目录目录5.1 集合框架集合框架l在Java语言中的java.util包提供了一些集合类,这些集合类又被称作容器,是一个包含多个元素的对象,集合可以对数据进行存储,删除,修改、查询等操作。它不同与数组,数组有固定长度,所以在定义数组的时候必须预先确定数组的大小,集合不必确定固定的大小,在存放对象是拥有更多的灵活性。l集合框架是一个用来代表和操纵集合的统一架构。l接口:表示集合的抽象数据类型。l实现类:集合接口的具体实现,是重用性很高的数据结构。l算法:用来根据需要对实体类中的对象进行计算,比如存储、查找、排序等。同一种算法可以对不同的集合实现类进行计算,这是利用了“多态”。5.1 集合框架集合框架lCollection接口是集合接口树的根,它是集合框架的顶级接口。lCollection接口是List、Queue和Set接口的父接口。5.1.1 Collection接口及常用子接口接口及常用子接口5.1 集合框架集合框架l接口List是有序的collection(也称为序列)。l此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。l使用List接口的实现类时,可以指定列表中每个元素的插入位置,用户可以根据元素的索引值(即元素在列表中的位置)访问元素,并搜索列表中的元素。5.1.2 List接口及实现类接口及实现类方法声明方法声明方法功能方法功能void add(int index,Object element)在列表的index位置添加元素Object remove(int index)删除列表中index位置的元素Object get(int index)返回列表index位置的元素Object set(int index,Object element)用指定元素替换列表中指定位置的元素1. ArrayList类ArrayList类是List接口的大小可变数组的实现,它实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。ArrayList list = new ArrayList(); / 创建ArrayList对象list.add(s1); / 将s1加入ArrayList列表list.add(s2);list.add(1, s3); / 将s3加入ArrayList列表中(列表第二个)Student temp = (Student) list.get(0);5.1.2 List接口及实现类接口及实现类2. LinkedList类LinkedList也实现了List接口,它是List接口的链接列表实现,它实现所有可选的列表操作,并且允许所有元素(包括 null)。除了实现 List 接口外,LinkedList类还为在列表的开头及结尾get()、remove()和insert()元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列。LinkedList list = new LinkedList();/创建LinkedList对象list.addFirst(s1); / 将s1加入LinkedList列表最前面(列表第一个)list.addFirst(s2);list.add(1, s3); / 将s3加入LinkedList列表中(列表第二个)Student temp = (Student) list.get(i);list.remove(0); / 删除列表第一个对象(标号为0)5.1.2 List接口及实现类接口及实现类3. Vector类Vector类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector的大小可以根据需要增大或缩小,以适应创建Vector后进行添加或移除项的操作。Vector vector = new Vector(); / 创建一个Vector对象vector.add(s1); / 将s1加入Vector列表最前面(列表第一个)vector.add(s2);vector.add(1, s3); / 将s3加入Vector列表中(列表第二个)Student temp = (Student) vector.get(i); vector.remove(0);5.1.2 List接口及实现类接口及实现类4. Stack类Stack类表示后进先出(LIFO)的对象堆栈。它通过五个操作对类Vector进行了扩展,允许将向量视为堆栈。它提供了通常的push()和pop()操作,以及取堆栈顶点的peek()方法、测试堆栈是否为空的empty()方法、在堆栈中查找项并确定到堆栈顶距离的search()方法。Stack stack = new Stack(); / 创建一个Stack对象stackstack.push(s1); /s1进栈(栈底)printStack(stack); / 显示栈中的所有元素stack.push(s2); /s2进栈printStack(stack); stack.pop(); /出栈5.1.2 List接口及实现类接口及实现类5.1 集合框架集合框架lSet接口是一个不包含重复元素的collection。更确切地讲,set不包含满足 e1.equals(e2) 的元素对e1和e2,并且最多包含一个null元素。lSet接口要求集合元素是唯一的(但元素可以为null), 不能保证迭代顺序恒久不变, 它是无序的。比较常用的实现类是HashSet类。5.1.3 Set接口及实现类接口及实现类5.1 集合框架集合框架 Set set = new HashSet(); System.out.println(set.add(hello); /true System.out.println(set.add(hello); /false System.out.println(set.remove(hello); /true System.out.println(set.remove(hello); /false System.out.println(set.add(null); /true System.out.println(set.remove(null); /true System.out.println(set.remove(null); /false5.1.3 Set接口及实现类接口及实现类5.1 集合框架集合框架 Set set = new HashSet(); set.add(hello 1); set.add(hello 2); set.add(hello 3); set.add(hello 4); set.add(hello 5); set.add(hello 6); Iterator iterator= set.iterator(); /迭代器iter while(iterator.hasNext() /输出set里的所有元素 String str = (String) iterator.next(); System.out.println(str); 5.1.3 Set接口及实现类接口及实现类5.1 集合框架集合框架lMap接口储存一组成对的键-值对象,提供key(键)到value(值)的映射。l一个映射不能包含重复的键;每个键最多只能映射到一个值。映射顺序定义为迭代器在映射的collection视图上返回其元素的顺序。某些映射实现可明确保证其顺序,如TreeMap类;另一些映射实现则不保证顺序,如最常见的HashMap类,它的储存方式是哈希表,优点是查询指定元素效率高。5.1.4 Map接口及实现类接口及实现类5.1 集合框架集合框架5.1.4 Map接口及实现类接口及实现类5.1 集合框架集合框架HashMap hm = new HashMap(); / 创建一个HashMap对象hm.put(001, s1); / 将s1加入hm中hm.put(002, s2); / put(Object,Object):一个是key一个是value,键值对hm.put(003, s3); / 将对象s2替换掉(因为key是唯一的) / 查找学号为002的学生,containsKey返回boolean值if (hm.containsKey(002)System.out.println(有此学生);Student s = (Student) hm.get(002); / 取出学号为002的学生对象5.1.4 Map接口及实现类接口及实现类5.1 集合框架集合框架lArrayList: 元素单个,效率高,多用于查询。lLinkedList: 元素单个,多用于插入和删除。lVector: 元素单个,线程安全,多用于查询。lStack: 元素单个,先进后出。它通过5个操作对Vector类进行扩展,允许将向量视为堆栈。lHashMap: 元素成对,元素可为空。lHashTable: 元素成对,线程安全,元素不可为空。5.1.5 各种集合的特点各种集合的特点5.2 泛型泛型l泛型是程序设计语言的一种特性,允许程序员在强类型程序设计语言中编写代码时定义一些可变部分。Java中泛型的引入主要是为了提高Java程序的类型安全,避免了集合类型元素在运行期出现类型转换异常,增加了编译时类型的检查。Student s1 = new Student(001, 张三);ArrayList list = new ArrayList(); list.add(s1);Student temp = list.get(0); / 取出get数据的时候不需要时候类型转换System.out.println(temp);5.2.1 泛型的意义泛型的意义5.2 泛型泛型Java中的泛型主要使用在类、方法与接口中。通常是在定义类时,在类的名称后,用尖括号括起来,用大写字母(T、E、K、V等)表示一种未知类型。虽然是未知类型,但可以把它作为已知类型使用,直到产生这个类的对象时,指是是哪种类型。泛型使用在类上的用法,其语法如下:class Question T o; /某个类型的变量作为其成员变量opublic Question(T t) /构造方法o = t ; 5.2.2 泛型在类中的应用泛型在类中的应用5.2 泛型泛型Java中的泛型也广泛使用在接口中,泛型接口与泛型类的定义及使用基本相同。泛型接口通常被用在各种类的生产器中。其语法如下:interface 接口名称interface interfo public T getInterfo (); 5.2.2 泛型在接口中的应用泛型在接口中的应用5.3 实训实训5 集合实现类的基础练习集合实现类的基础练习要求:创建一个商品类Product类,在该类中定义3个属性和toString()方法,分别实现setter()和getter()方法,创建一个测试类Demo5_12,调用Product类的构造函数实例化三个对象,并将 Product 对象保存至 ArrayList 集合中。最后遍历该集合,输出商品信息。任务任务1:使用集合实现类:使用集合实现类ArrayList存储对象存储对象5.3 实训实训5 集合实现类的基础练习集合实现类的基础练习要求:定义一个Teacher类及其子类CollegeTeacher类,Teacher类具有id,name,subject等属性;CollegeTeacher类还具有scientificResearch的属性。任务任务2:使用集合实现类:使用集合实现类HashMap存储对象存储对象小结小结lCollection接口 Collection是所有单列集合的根接口。l集合本质上是一个容器,这个容器可以存放很多数据。数组也是一个容器,不同的是,数组长度固定,可以存放任何数据类型的数据,集合长度可变,只能存放引用类型即对象。l泛型是一种未知的,不确定的数据类型。l如果在类上面定义泛型,那么这个泛型在整个类中都可以使用,并且在类上面定义泛型,需要使用这个类的时候才能确定这个泛型真正表示的是什么数据类型。