资源描述
单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,第23讲集合,数组可以用来保存一组数据,但数组的大小一旦定义就不能改变。使用数据类存储根本数据类型时非常有效,可以定义对象数组来存储一组对象,但有时并不能确定到底要存储多少个对象。为此,Java实用类库提供了一套容器类来解决这个问题。,第23讲集合,23.1 集合框架,23.2 Collection,23.2.1 Set规那么集,23.2.3 List线性表,23.3 Map,23.1 集合框架,Java容器类的作用是用来“保存对象,是可变长的对象数组,其可分为两种类型:,1Collection称为集合:一个独立元素的序列。,2Map称为映射表或图:一组成对的“键/值对象。,图23.1为Java集合框架的继承关系图。,23.2 Collection,Java集合框架中常用的Collection有三种:Set规那么集、List线性表和Queue队列。Set的实例用于存储一组不重复的元素,List的实例用于存储一个由元素构成的有序集合,而Queue的实例用于存储使用先进先出方式处理的对象。,23.2.1 Set规那么集,Set接口扩展了Collection接口,它并没有引入新的方法或常量,只是规定了Set的实例不能包含重复的元素。实现Set接口的具体类必须确保没有向其添加重复的元素。,常用的实现Set接口的类有三个,分别为:HashSet散列集、LinkedHashSet链式散列集和TreeSet树形集。,1HashSet散列集,HashSet可以用来存储互不相同的任何元素。,2LinkedHashSet链式散列集,LinkedHashSet是HashSet的子类,它使用链表扩展了HashSet类。LinkedHashSet中的元素是有序的,其顺序为插入,3TreeSet树形集,SortedSet接口为Set的子接口,它确保了Set中的元素是有序的,这些元素按自然顺序进行排序或者按照创立Set时所指定的Comparator 进行排序。方法first、last、headSet和tailSet分别返回规那么集中的第一个元素、最后一个元素、小于给定元素和大于等于给定元素的元素顺序。,sNavigableSet接口扩展了SortedSet接口,增加了导航方法。方法 lower、floor、ceiling 和 higher 分别返回小于、小于等于、大于等于、大于给定元素的元素,如果元素不存在,那么返回 null。也可以按升序或降序访问和遍历 NavigableSet。,23.2.2 Comparator比较器接口,向TreeSet中添加的对象是可以相互比较的,而常用的比较对象的方式有两种:,1使用Comparable接口。,这种方法用于使用实现了Comparable接口的类所创立对象的比较,Comparable接口中定义了compareTo方法,这种方法定义的顺序为自然顺序。Java中API中的许多类都实现了Comparable接口,如:由于String类实现了Comparable接口,所以在TestTreeSet.java中String类的实例可以存储到TreeSet中,并按自然顺序排序。,2使用Comparator比较器接口。,有些类没有实现Comparable接口,或者虽然实现了Comparable接口但不想使用compareTo方法进行比较,这时可以为规那么集中的元素指定一个比较器,此比较器为实现了Comparator接口的类所创立的对象。规那么集中的元素按照比较器中规定的顺序进行排序。,Comparator接口中定义了两个方法:,int compare(T o1,T o2):对两个参数进行比较,如果o1小于o2,返回一个负数;如果o1大于o2,返回一个正数;如果o1等于o2,返回0。,boolean equals(Object obj):如果obj也是一个比较器,那么比较obj与此比较器是否相等,如果相等返回true。,23.2.3 List线性表,规那么集中不能存储重复的元素。可以使用线性表来存储重复元素,另外线性表还可以为元素指定存储位置,使用下标进行访问。常用的实现List接口的类有两个ArrayList和LinkedList,它们都按照被插入的顺序保存元素,两者的不同在于执行某些操作时的性能。,1ArrayList数组线性表,ArrayList采用数组来存储元素,但数组是动态创立的,当ArrayList中的元素个数超过出了数组的容量时,就创立一个更大的新数组,把当前数组中的元素全部复制到这个新数组中,所以,ArrayList在随机访问元素时效率很高。,2LinkedList链式线性表,LinkedList使用链表来存储元素,所以,LinkedList在添加删除元素时效率很高。,23.2.4 Queue队列,队列是一种先进先出的数据结构,在队头删除元素,在队尾添加元素。而在优先队列中,元素可以被赋予优先级,优先级高的元素首先被删除。,1Deque双端队列和LinkedList链表,Deque是双端队列,支持在队列的两端添加和删除元素。而LinkedList实现了Deque,可以使用LinkedList创立一个队列或双向队列。,Queue接口中定义了如下方法来实现队列元素的访问:,boolean add(E e):将指定的元素插入此队列如果立即可行且不会违反容量限制,在成功时返回true,如果当前没有可用的空间,那么抛出 IllegalStateException。,E element():获取,但是不移除此队列的头。,boolean offer(E e):将指定的元素插入此队列如果立即可行且不会违反容量限制,当使用有容量限制的队列时,此方法通常要优于add(E),后者可能无法插入元素,而只是抛出一个异常。,E peek():获取但不移除此队列的头;如果此队列为空,那么返回null。,E poll():获取并移除此队列的头,如果此队列为空,那么返回null。,E remove():获取并移除此队列的头。,而Deque中增加了如下方法只列出了局部方法,以实现双端队列中元素的访问:,void addFirst(E e):将指定元素插入此双端队列的开头如果可以直接这样做而不违反容量限制。,E removeFirst():获取并移除此双端队列第一个元素。,void addLast(E e):将指定元素插入此双端队列的末尾如果可以直接这样做而不违反容量限制。,E removeLast():获取并移除此双端队列的最后一个元素。,E getFirst():获取,但不移除此双端队列的第一个元素。,E getLast():获取,但不移除此双端队列的最后一个元素。,2PriorityQueue优先队列,PriorityQueue类是一个优先队列,优先级队列的元素按照其自然顺序进行排序,或者根据构造队列时提供的Comparator进行排序,具体取决于所使用的构造方法。优先级队列不允许使用null元素。依靠自然顺序的优先级队列还不允许插入不可比较的对象这样做可能导致ClassCastException异常。,此队列的头 是按指定排序方式确定的最小元素。如果多个元素都是最小值,那么头是其中一个元素选择方法是任意的。队列获取操作poll、remove、peek 和element访问处于队列头的元素。,23.3 Map,Map是一种按照键值来存储元素的容器,键值与List的下标相似,但List中的下标是整数,而键值可以是任意的数据类型的对象。键值不能重复,每个键值对应一个值,他们一一对应。有三种常用具体类实现了Map:,1HashMap,在HashMap中定位一个值,向其插入一个键值对以及删除一个键值对时非常高效。,2LinkedHashMap,使用链表扩展了HashMap,HashMap不支持排序,而,LinkedHashMap增加了排序功能。使用LinkedHashMap构建Map时的构造方法不同,排序方式也不同。无参构造方法创立的LinkedHashMap对象是按照插入顺序对键值进行排序的,而有参构造方法LinkedHashMap(int initialCapacity,float loadFactor,boolean accessOrder)是按访问顺序对键值进行排序的。,3TreeMap,TreeMap在遍历排序好的键值时非常高效。键值可以使用Comparable接口或Comparator接口进行排序,当然要选择不同的构造方法。,讲后练习,1,、编写程序,读取文本文件,将其中不重复的单词按照升序显示。,2,、编写程序,读取任意一个,Java,源文件,计算该文件中的关键字个数。,3,、编写程序,读取任意一个文本文件,并统计该文本文件中单词的出现频率。,
展开阅读全文