第9章Java的集合类.ppt

上传人:sccc 文档编号:5931174 上传时间:2023-09-05 格式:PPT 页数:38 大小:248.04KB
返回 下载 相关 举报
第9章Java的集合类.ppt_第1页
第1页 / 共38页
第9章Java的集合类.ppt_第2页
第2页 / 共38页
第9章Java的集合类.ppt_第3页
第3页 / 共38页
第9章Java的集合类.ppt_第4页
第4页 / 共38页
第9章Java的集合类.ppt_第5页
第5页 / 共38页
点击查看更多>>
资源描述

《第9章Java的集合类.ppt》由会员分享,可在线阅读,更多相关《第9章Java的集合类.ppt(38页珍藏版)》请在三一办公上搜索。

1、第9章 Java的集合类,学习重点:集合类与普通数组的区别各种集合类的特点及适用条件,第9章 Java的集合类,9.1 集合类概述 9.2 原集合类 9.2.1 数组 9.2.2 Vector类 9.2.3 BitSet类 9.2.4 Stack类 9.2.5 Hashtable类 9.3 新集合类 9.3.1 Collection 9.3.2 List 9.3.3 Set 9.3.4 Map 9.3.5 Utilities 9.4 练习题,9.1 集合类概述,集合类是用来存放某类对象的。我们知道,数组是有固定长度的,在定义数组的时候,就需要确定这个数组的内存空间,但很多时候我们不能确定需要存

2、放多少元素,这时数组就显得很不方便,这时就需要使用集合类。集合类有一个共同特点,就是它们只容纳对象(实际上是对象名,既指向地址的指针),这一点和数组不同,数组可以容纳对象和简单数据。集合类容纳的对象都是Object类的实例,一旦把一个对象置入集合类中,它的类信息将丢失,也就是说,集合类中容纳的都是指向Object类对象的指针。,9.2 原集合类,9.2.1 数组例9.1 数组中容纳对象和简单数据这个程序中把对象和简单数据分别作为数组的元素,然后对它们分别操作 程序代码上面的程序中我们用同样的格式设计了两种数组:对象数组和简单数据类型数组,以进行比较。数组a只是初始化成一个null的对象名(指针

3、),此时,编译器会禁止我们对 这个指针进行任何实际操作。数组b被初始化成指向由Weeble类对象构成的一个数组,但那个数组里实际 并未放置任何Weeble对象,所以数组b的元素都是空指针,不能直接 使用,然而,我们仍然可以查询那个数组的大小,因为b指向的是一 个合法对象。这个程序中还用到对象间的赋值,对象间赋值传递的是 指针。,例9.2 对象数组的传递,这个程序中我们用一个数组来存放香味名(字符串对象),然后从这个数组中随机抽出香味名,形成20个随机排列,并输出。计算中每次都形成一个新的对象数组,并在不同的方法中传递。程序代码flavorSet()方法创建了一个名为results的String

4、数组。该数组的大小为n,具体数值取决于传递给方法的自变量。随后,它从数组flav里随机挑选一些香料(Flavor),并将它们置入results里,并最终返回results。返回数组与返回其他任何对象没什么区别,返回的都是一个指针。另一方面,当flavorSet()随机挑选香料的时候,它需要保证以前挑选过的香料不会再次出现。main()能显示出20个完整的香味名集合,所以我们看到flavorSet()每次都用一个随机顺序选择香料。,9.2.2 Vector类,该类实现了可变数组。和数组一样,它的元素可通过下标进行访问。Vector类的对象通过capacity和capacityIncrement两

5、个值来改变集合的容量,capacity指示集合最多能容纳的元素个数,capacityIncrement指示每次增加多少容量,而不是一个一个增加的。,这个类有3个属性、多个构造函数和许多其他方法。下面列举几个方法:,void addElement(Object obj)在集合的最后增加一个元素void add(int index,Object element)在指定位置增加一个元素Object elementAt(int index)返回指定位置的元素void insertElementAt(Object obj,int index)在指定位置插入元素void removeElementAt(i

6、nt index)删除指定位置的元素int catacity()返回当前容量int size()返回集合的元素个数,例9.3 集合中元素必须是同类的对象,程序代码这个程序中只有在执行(Cat)cats.elementAt(7).print();的时候抛出例外。在这个程序中也看到了重新造型的格式:(Cat)cats.elementAt(i),因为一个集合的元素是一个Object类的对象,所以必须把它强制转换成Cat类的对象进行操作。,能不能把元素转换成Dog类?,答案是肯定的,把程序中的最后两句换成如下形式,就能把最后一个元素输出。for(int i=cats.size()-1;i=0;i-)(

7、Dog)cats.elementAt(i).print();这时的输出结果为:Dog#7Exception in thread main java.lang.ClassCastException:Cat at CatsAndDogs.main(CatsAndDogs.java:31),程序中我们用到了size()这个方法来确定元素的个数,其实有另一个方法可以让程序自动检查元素的类型以及集合的最后一个该类型元素,这就是Enumeration(枚举接口),它是一个简单的反复器(iterator),它能实现对集合的遍历。实现枚举的对象必须通过Vector类的方法elements()来创建,这个方法返

8、回反映当前集合内容的实现枚举的对象。然后通过枚举的方法实现对集合的遍历:Object nextElement()/获得下一个元素,定一次调用返回定一个元素bealoon hasMoreElements()/检查集合中是否有更多的元素,我们就用这两个方法来代替上面的一部分程序,其中改动import语句和主类如下:,import java.util.*;/这一部分不变public class CatsAndDogs public static void main(String args)Vector cats=new Vector();for(int i=0;i 7;i+)cats.addElem

9、ent(new Cat(i);cats.addElement(new Dog(7);/以下部分是更新的代码 Enumeration e=cats.elements();/创建Enumeration对象e while(e.hasMoreElements()/使用e来完成集合的遍历(Cat)e.nextElement().print();这个程序的输出结果同原先的程序,其中的黑体部分就是更改部分。使用Enumeration,我们不必关心集合中的元素数量。所有工作均由hasMoreElements()和nextElement()自动照管了。,9.2.3 BitSet类,这个类实际是由“二进制位”构成

10、的一个Vector,即这个Vector集合中的元素都是false或true,默认值都为false。此外,BitSet的最小长度是一个长整数(Long)的长度:64位,这意味着假如我们准备保存比它更小的数据,如8位数据,那么BitSet就显得浪费了。,它有以下几个特殊的方法:,public void and(BitSet set)进行逻辑运算,还有or()和xor()public int length()有效逻辑位的位数public int size()返回集合中的元素个数,最小为64public void set(intbitIndex)把指定位置的值置为truepublic void cle

11、ar(intbitIndex)把指定位置的值置为falsepublic boolean get(intbitIndex)得到制定位置的值,例9.4 使用BitSet类,这段程序的目的是随机产生一个数字串,然后逐一判断它每一个二进制位是否为1,是则在BitSet的相应位置上置true,否则置false 888程序代码,9.2.4 Stack类,Stack类是Vector类的子类,它是一个“后入先出”(LIFO,last-in-first-out)的集合。Stack的意思就是堆栈,堆栈就像一个桶,只有一个口,放入和取出都用这个口,最后放入的东西能最先拿出,最先放入的东西只能最后拿出。通常在堆栈中存

12、入数据称为“压入”(push),取出数据成为“弹出”(pop)。由于压入和弹出都在堆栈口进行,所以位置很确定,这和其他集合不同。和其他所有Java集合一样,我们压入和弹出的都是对象,所以必须对自己弹出的东西进行造型。,这个类增加了5个方法:,public Object push(Objectitem)把形参对象压入堆栈public Object pop()弹出第一个对象public Object peek()并不取出的情况下,看定一个对象public boolean empty()是否为空public int search(Objecto)检查第一个出现形参对象的位置,例9.5 堆栈类的使用,

13、这个程序的目的是将英文的12个月存放到一个Stack中,然后按顺序打印出来。程序代码从这个程序的结果可以清楚地看到,先压入的后弹出,这个类的对象也可以使用Vector类的方法,如addElement()和elementAt()等。,9.2.5 Hashtable类,这个类是字典类(Dictionary)的子类,字典类是抽象类,它达到的目的是通过一个键(key)来查找元素,这和实际的查字典及其相似。,该抽象类有许多方法,size()告诉我们其中包含了多少元素,isEmpty()判断是否包含了元素(是则为true),put(Object key,Object value)添加一个值,并将其同一个键

14、关联起来,get(Object key)获得与某个键对应的值,而remove(Object Key)用于从列表中删除“键值”对。还可以使用枚举技术,keys()产生对键的一个枚举(Enumeration),而elements()产生对所有值的一个枚举。Hashtable类不仅实现父类的方法,还有自己的方法,下面这个方法就是用来检查形参对象是否是一个散列表的键:public boolean containsKey(Objectkey),例9.6 用Hashtable来检查随机数的随机性,下面的程序将随机整数对应在020之间,然后生成10 000个随机数,看它们在020间的分布如何。程序代码 这个

15、程序中我们建立一个Hashtable表ht,其中的“键值”对是随机数(r)与统计数(Counter.i),其中的随机数是键,统计数是值。,9.3 新集合类,集合类继承关系图 事实上这个集合族中分两个部分。一个是Collection系,它是以下标访问元素的集合,它实际含有List和Set两个组件。另一个是Map系,它是一种映射,通过键来访问元素的集合(可见Hashtable是应该属于这个系的),,9.3.1 Collection,Collection的所有方法:public int size()public boolean isEmpty()public boolean contains(Obj

16、ecto)是否含有形参对象public Iterator iterator()产生一个反复器,其中包含了该collection对象中所有的元素,类似于一个枚举类型的对象public Object toArray()返回一个包含所有元素的对象数组public Object toArray(Objecta)把所有元素放入a中public boolean add(Objecto)集合中加入对象,成功时返回truepublic boolean remove(Objecto)public boolean containsAll(Collectionc)判断c是否为子集public boolean add

17、All(Collectionc)public boolean removeAll(Collectionc)清空指定集合public boolean retainAll(Collectionc)删除所有c中没有的元素public void clear()清空集合public boolean equals(Objecto)比较两个对象是否相同public int hashCode()获取集合的hashcode,例9.7 Collection的使用,这个程序非常简单,只是用来演示大部分的Collection含有的方法,因为这些方法在它的“子类”中都能使用,所以先熟悉这些方法。由于Collection

18、是一个接口,所以它的实例只能是它“子类”的对象。程序代码,9.3.2 List,List的明显特征是它的元素有一个确定的顺序,它比Collection多了一些指定位置增删改的方法。它能产生ListIterator的对象。实现它的类有ArrayList和ArrayList。ArrayList内存中是顺序存储的(元素的内存位置紧邻),而LinkedList内存中是以链表(数据结构中的内容,这里不再讲)的形式存储,所以ArrayList比较适用于经常遍历访问,ArrayList比较适用于经常在中间进行增删改操作。ArrayList是被用来代替Vector的一个通用的可变数组类,因而,Java1.2以

19、后的编程应多使用ArrayList。,9.3.3 Set,Set与Collection有完全相同的对外接口,实际上就是一个Collection,但添加到Set的每个元素都必须是独一无二的,Set不会添加重复的元素。添加到Set里的对象必须定义equals()方法,以提供算法来判断欲添加进来的对象是否与已经存在的某对象相等,从而建立对象的惟一性。一个Set不能保证自己可按任何特定的顺序维持自己的元素。实现Set的类有HashSet和TreeSet,HashSet是以hash桶来存放元素,能实现快速查找,TreeSet是一种有顺序的集合,一般以字典式升序排列,或以创建Set时指定的Comparat

20、or来排序,内存中以二叉树型结构存储。由于TreeSet实现了SortedSet,所以有几个特殊的方法,例如:public Object first()获取第一个即排在最低位的一个public Object last()获取排在toElement之前的元素组成的SortedSet,例9.8 set中元素的惟一性,下面的程序演示Set中的元素是惟一的,即使多次添加同一个值,集合中依然是原来几个。这个程序使用了Collection类中的方法程序代码,9.3.4 Map,Map这种接口用来维持很多“键值”对,以便通过一个键查找相应的值。HashMap基于一个散列表实现(用它代替Hashtable)。

21、针对“键值”对的插入和检索,这种形式具有较好的执行性能。TreeMap 在一个二叉树的基础上实现。查看键或者“键值”对时,它们会按固定的顺序排列(取决于Comparator)。TreeMap最大的好处就是我们得到的是已排好序的结果。TreeMap是含有subMap()方法的惟一一种Map,利用它可以返回树的一部分。WeakHashMap是一种特殊的HashMap,对于那些弱键,垃圾收集器会自动删除,因而,对应的“键值”对可能会丢失。,例9.9 Map的用法这个程序先定义两个字符串数组,用这些字符串构造Map,并把它的键和值分别输出,然后遍历这个Map,再使用Map的一些方法。,程序代码 可见,

22、虽然testData1被放入了两次,但Map对象中并没有重复的数据,当程序调用:Map m2=fill(new TreeMap(),testData2);m.putAll(m2);我们又可以看到这样的结果:Size=10,Keys:Dopey|Bashful|Belligerent|Sleepy|Lazy|Happy|Comatose|Grumpy|Sneezy|Doc|可见testData2中的数据也放进来了。,9.3.5 Utilities,1.Arrays Arrays类为所有基本数据类型的数组提供了一个重载的sort()和binarySearch(),它们也可用于String和Obje

23、ct。,例9.10 数组工具的使用,这个程序定义了两个重载的方法来产生随机字符串,两个重载的打印方法,main()方法中用随机类产生随机数进行排序和查找,而后用已定义的随机字符串类产生字符串,排序并查找。程序代码对于字符,如果用默认的比较器,会区分大小写。,例9.11 自己定义比较方法的sort(),这个程序中把接收的对象转化为字符串,并全部改成小写后进行比较,就不区分大小写了。程序代码这个例子的一个结果为,例9.12 比较对象来排序,这个程序定义了一个比较对象的比较器,可能读者会怀疑如何能比较对象,事实上,只是把对象的某一内容(如名称、属性值等)进行比较,读者也可以自己定义。程序代码程序的结

24、果,2.Collections,Collections类可用与数组相同的形式排序和搜索一个列表(List)。用于排序和搜索列表的静态方法包含在类Collections中,但它们拥有与Arrays中差不多的方法名。sort(List)用于对一个实现了Comparable的对象列表进行排序。binarySearch(List,Object)用于查找列表中的某个对象。sort(List,Comparator)利用一个“比较器”对一个列表进行排序。binarySearch(List,Object,Comparator)则用于查找那个列表中的一个对象。,例9.13 排序工具示范,这个例子利用了上面的Co

25、mpClass,AlphaComp和Collectionx以及Arrayx来示范Collections中的排序工具。程序用了两个不同的ArrayList对象来演示Collections中的排序和查找方法。程序代码执行结果,9.4 练 习 题,1.选择题(1)Vector类的对象中的元素可以是:A.int型整数 B.浮点数 C.对象 D.属性,(2)BitSot的最小长度是:A.8位 B.16位 C.32位 D.64位,2.程序阅读题,(1)阅读下列程序,加入输入参数a b r a c o p o p s t q,会得到什么样的结果?import java.util.*;public class

26、 Freq private static final Integer ONE=new Integer(1);public static void main(String args)Map m=new TreeMap();for(int i=0;iargs.length;i+)Integer freq=(Integer)m.get(argsi);m.put(argsi,(freq=null?ONE:new Integer(freq.intValue()+1);System.out.println(m.size()+distinct words detected:);System.out.println(m);,3.编程题,(1)编制一个程序,用Class类来获取所有关于HashSet类的信息。(2)用ArrarList来实现一个列表,然后用Collections类进行排序、搜索。用不同类型的元素进行试验。(3)用HashMap来检查随机数的分布情况。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 建筑/施工/环境 > 农业报告


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号