• 1. 面向对象程序设计学API 集合类10/22/20181www.csuinfosoft.com
  • 2. 目标集合简介 Collection与Map接口 迭代器Iterator Arrays与Collections 泛型集合 10/22/20182www.csuinfosoft.com
  • 3. 集合框架介绍引言:通常,程序总是根据运行时才知道如何创建新对象。在此之前,不会知道所需对象的数量;类型 普遍存在的编程问题:需要在任意时间;任意位置,创建任意数量的对象 JAVA中的解决方案: 1、数组: 它是编译器支持的类型,数组时保存一组对象的最有效的方式。 缺点:数组具有固定的长度(在编写程序时并不知道将需要多少个对象);类型的限制 2、容器; 由JAVA实用类库提供的一组类。 优点:提供了完善的方法保存对象,并且无数量限制(即:容器类可以自动调整其大小)10/22/20183www.csuinfosoft.com
  • 4. 基本容器(集合):List ;Set;Queue和Map 所处包:java.util 集合的优点:提供了完善的方法保存对象,并且无数量限制(即:容器类可以自动调整其大小)10/22/20184www.csuinfosoft.com
  • 5. 集合分类JAVA集合对象的用途:保存对象 集合的分类: 1、Collection(接口) 独立元素序列,这些元素都服从一条或多条规则 组成部分: 1)、List接口(可重复序列) 必须按照插入的顺序保存元素,即以特定的顺序保存一组元素; 2)、Set接口(无重复序列) 保存的元素不能重复 3)、Queue接口(队列) 按排队规则确定对象产生的顺序(通常与元素被插入顺序相同)。只允许在容器的一端插入对象,并从另外一端移除对象10/22/20185www.csuinfosoft.com
  • 6. 2、Map(接口) 一组成对的”键值对“对象(关联数组/字典),允许使用键查找对应的值 优点:可以建立对象与对象间的关联 10/22/20186www.csuinfosoft.com
  • 7. 容器组织结构图IteratorCollectionproducesMapproducesListIteratorListSetQueueAbstractCollectionproducesAbstractListVector (Legacy)Stack (Legacy)AbstractSetHashSetTreeSetLinkedHashSetArrayListAbstractSequentialListLinkedListSortedSetAbstractMapHashMapSortedMapTreeMapIdentityHashMapHashtable (Legacy)WeakHashMapLinkedHashMapComparableComparatorCollectionsArraysUtilities10/22/20187www.csuinfosoft.com
  • 8. 集合的使用: 理想情况下,编写的大部分代码都应该是在与其接口打交道,唯一需要制定所使用的精确类型的地方就是在创建对象的时候(注意:确定在进行向上转型时,上层类或接口具有你想要的方法,并在下级类中重写过) 例如:List students = new ArrayList(); 使用接口的目的: 如果后期需要修改对象的实现,那么,只需要在对象创建处修改 10/22/20188www.csuinfosoft.com
  • 9. Collection接口Collection接口概况了序列的概念 – 一种存放一组对象的方式 所有的Collection都可以用foreach语法遍历 常用接口方法: isEmpty() ;add(E e) ;clear() ; size() ; contains(Object o) ;equals(Object o) ; remove(Object o) ; iterator() ; toArray() 10/22/20189www.csuinfosoft.com
  • 10. ListList可重复序列。List接口在 Collection的基础上添加了大量的方法,使得可以在List的中插入和移除元素 两种类型的List: 1、ArrayList 特点:随机访问元素快,但执行插入和移除元素时较慢 2、LinkedList 特点:随机反问比较慢,但其它特性比ArrayList强 3、Stack 栈(叠加栈) :通常是指“后进先出”(LIFO)的容器。 特点:先进后出 注意:LinkedList具有能够直接实现栈的所有功能的方法,因此可以直接将LinkedList作为栈使用 10/22/201810www.csuinfosoft.com
  • 11. List中常用方法Contains() 确定某个对象是否在列表中 Remove() 从列表中移除一个对象 indexOf() 搜索指定对象在列表中所处位置的索引编号(从0开始) subList() 获取子列表 containsAll() 判断一个集合中的元素是否包含在另一个集合中 retainAll 两个集合的“交集”操作 removeAll() 从列表中移除指定所有元素 Set() 对指定位置的元素进行替换 isEmpty() 判断列表是否为空 Clear() 清空列表 toArray() 将列表中的元素转换为具有合适大小的数组 Add() 往列表中添加元素 Get() 从列表中获取元素 Iterator()返回一个包含列表元素的Iterator对象10/22/201811www.csuinfosoft.com
  • 12. LinkedListLinkedList添加了可以使其用作栈、队列或双端队列的方法 特有方法: 1)getFirst()与element()一样 返回列表中第一个元素,而不移除它,如果List为空,则抛出NoSuchElementException 2)peek() 与getFirst(),element()类似,只是在列表为空时返回null 3)removeFirst()与remove()一样 移除返回列表的头,而在列表为空时抛出NoSuchElementException 4)poll() 与removeFirst()与romove类似,只是在列表为空时返回null 5)addFirst()与add();addLast()相同,都是将某个元素插入到列表的尾部 6)removeLast()移除并返回列表的最后一个元素 注意:Queue接口,在LinkedList基础上添加了element()、offer()、peek()、poll()、remove()方法10/22/201812www.csuinfosoft.com
  • 13. SetSet无重复序列。如果试图将相同对戏那个的多个实例添加到Set中,那么它就会阻止这种重复现象。 注意: Set具有与Collection完全一样的接口,因此没有任何额外的功能。实际上Set就是Collection,只是行为不同 三种类型的Set: 1) HashSet 使用的是散列码函数,对元素进行排列和搜索 特点:搜索速度快 2) TreeSet 将元素存储在红-黑树数据结构中 特点: 指定元素排列方式 3) LinkedHashSet 采用了散列码与链表来快速搜索元素和维护元素10/22/201813www.csuinfosoft.com
  • 14. QueueQueue(队列):是一个典型的先进先出(FIFO)的容器 即从容器的一端存入,从另一端取出。并且,存入容器的数据顺序与取出的顺序相同。 用途:并发编程(作为一种可靠地将对象从程序的某个区域传输到另一个区域的途径) 注意: 1) LinkedList提供了方法以支持队列的行为,并实现了Queue接口,因此LikedList可以用作Queue的一种实现。通过将LikedList向上转型为Queue 2) Queue接口窄化了对LinkedList的方法的访问权限,以使得只有恰当的方法才可以使用(即LinkedList可用方法变少)10/22/201814www.csuinfosoft.com
  • 15. Queue中常用方法offer() 将一个元素插入到队尾,或者返回false peek()和element() 在不移除队列头部元素的情况下返回队头 注意:peek()在队列为空时返回null;element()会抛出NoSuchElementException poll()和remove() 移除并返回队头 注意:poll()在队列为空时返回null;remove()会抛出NoSuchElementException 10/22/201815www.csuinfosoft.com
  • 16. 两种常用Queue类: 1、LinkedList 2、PriorityQueue(优先队列) 常规队列规则:下一个元素应该是等待时间最长的元素 优先队列规则:下一个弹出元素是具有最高优先权的元素 特点: 1)对象会在队列中被排序,默认排序为自然顺序(可通过提供自己的Comparator修改排序方式); 2)确保被获取的元素是队列中优先级最高的元素 3)允许重复,最小的值拥有最高优先级(如果是String,空格也可以算作值,并且比字母的优先级高) 4)在PriorityQueue中使用自定义类,必须提供自己的Comparator10/22/201816www.csuinfosoft.com
  • 17. MapMap(关联数组/字典):通过键/值对建立数据与数据之间联系的一种方式 特点: 1)通过某个键,可以找到对应的值; 2)键部分不允许为空和重复,而值部分可以 3)通过其他集合对象,建立更复杂的数据结构10/22/201817www.csuinfosoft.com
  • 18. Map中常用方法put(K key, V value) 将指定的值与此映射中的指定键关联(可选操作) get(Object key)返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回 null keySet() 返回此映射中包含的键的 Set 视图 values() 返回此映射中包含的值的 Collection 视图 remove(Object key) 如果存在一个键的映射关系,则将其从此映射中移除(可选操作) 10/22/201818www.csuinfosoft.com
  • 19. 三种常用Map类: 1、HashMap 特点: 1)提供所有可选的映射操作,并允许使用 null 值和 null 键 2)不保证映射的顺序,特别是它不保证该顺序恒久不变 3)线程不同步的 2、HashTable 特点: 1)任何非 null 对象都可以用作键或值 2)为了成功地在哈希表中存储和获取对象,用作键的对象必须实现 hashCode 方法和 equals 方法 3、TreeMap 基于红黑树(Red-Black tree)数据结构 特点: 1)根据其键的自然顺序进行排序,或者根据创建映射时提供的 Comparator 进行排序 2)线程不同步的 10/22/201819www.csuinfosoft.com
  • 20. 迭代器(Iterator)问题:如果原来是对着List编码的,但是后来发现如果能够把相同的代码应用于Set,将会显得非常方便,此时应该怎么做?如何才能不重写代码就可以应用于不同类型的容器? 迭代器(也是一种设计模式):是一个对象,用于遍历并选择序列中的对象,而客户端程序员不必知道或关心该序列底层的结构。迭代器通常被称为轻量级对象:创建它的代价小 特点:JAVA的Iterator只能单向移动10/22/201820www.csuinfosoft.com
  • 21. Iterator常用操作: 1)使用方法iterator()要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素; 2)使用next()获取序列中的下一个元素 3)使用hasNext()检查序列中是否还有元素 4)使用remove()将迭代器新近返回的元素删除 特点:1) 不被关心容器中元素的数量,交由hasNext()和next() 2) 能够将遍历序列的操作与序列底层的结构分离 3) 迭代器统一了对容器的访问方式 注意:1)如果只是向前遍历List,而不修改List对象本身,那么建议使用foreach语法; 2)Iterator可以移除由next()产生的最后一个元素,这意味着在调用remove()之前必须先调用next() 10/22/201821www.csuinfosoft.com
  • 22. ListIterator: 是一个强大的Iterator的子类型,只能用于各种List类的访问 特点:可以双向移动 特有方法: 1)previous() 返回列表中的前一个元素 2)hasPrevious()  如果以逆向遍历列表,列表迭代器有多个元素,则返回 true 3)previousIndex()  返回对 previous 的后续调用所返回元素的索引 10/22/201822www.csuinfosoft.com
  • 23. Arrays与CollectionsArrays和Collections类 注意:Arrays针对数组提供了一系列方法; Collections是基于collection 上,进行操作或返回 collection 的静态方法组成 Arrays.asList()方法接受一个数组或是一个逗号分隔的元素列表(可变参数),并将其转换为一个List对象 Collections.addAll()方法接受一个Collection对象,以及一个数组或是一个用逗号分隔的列表,将元素添加到Collection中10/22/201823www.csuinfosoft.com
  • 24. 注意: (1)Collection.addAll()成员方法只能接受另一个Collection对象作为参数,因此它没有Arrays.asList()或Collections.addAll()灵活,因为,这两个方法使用的都是可变参数列表 (2)直接使用Arrays.asList(),将其当作List使用,其底层表示的是长度已知的数组,因此,不能调整大小10/22/201824www.csuinfosoft.com
  • 25. 泛型集合泛型:在类名之后附加,告诉编译器这将是一个参数化类型,而其中的类型参数,即在类被使用时将会被实际类型替换的参数,就是T。 JAVA SE5 例如:Stack stack = new LinkedList(); 定义一个可以持有T类型对象的Stack,Stack是用LinkedList实现的,而LinkedList也被告知它将持有T类型对象。非T类型的不能存入该集合对象 10/22/201825www.csuinfosoft.com