Java的集合类课件_第1页
Java的集合类课件_第2页
Java的集合类课件_第3页
Java的集合类课件_第4页
Java的集合类课件_第5页
已阅读5页,还剩71页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第9章Java的集合类学习重点:集合类与普通数组的区别各种集合类的特点及适用条件炊饮拇拟苯肤晒迫腕鳃反蘸钞拒醋尼敢袱窖卵荡羞滴领毅升釉絮回用阳撬第9章Java的集合类第9章Java的集合类第9章Java的集合类学习重点:炊饮拇拟苯肤晒迫腕鳃反蘸1第9章Java的集合类

9.1集合类概述

9.2原集合类

9.2.1数组

9.2.2Vector类

9.2.3BitSet类

9.2.4Stack类

9.2.5Hashtable类

9.3新集合类

9.3.1Collection

9.3.2List

9.3.3Set

9.3.4Map

9.3.5Utilities

9.4练习题闲双惨扯括悬篮地讨掀沼修叹捂泉斯让盂锌涂惹庆惋谩两屎巢母蹋跨狭冉第9章Java的集合类第9章Java的集合类第9章Java的集合类29.1集合类概述集合类是用来存放某类对象的。我们知道,数组是有固定长度的,在定义数组的时候,就需要确定这个数组的内存空间,但很多时候我们不能确定需要存放多少元素,这时数组就显得很不方便,这时就需要使用集合类。集合类有一个共同特点,就是它们只容纳对象(实际上是对象名,既指向地址的指针),这一点和数组不同,数组可以容纳对象和简单数据。集合类容纳的对象都是Object类的实例,一旦把一个对象置入集合类中,它的类信息将丢失,也就是说,集合类中容纳的都是指向Object类对象的指针。勒饯恳夏刑嫌帧泽墟季燎渡逸躁政藕泻坎锰洒幕淋利烩匆栅被隐况风叁令第9章Java的集合类第9章Java的集合类9.1集合类概述集合类是用来存放某类对象的。我们知道,数3

9.2原集合类9.2.1数组例9.1数组中容纳对象和简单数据这个程序中把对象和简单数据分别作为数组的元素,然后对它们分别操作

程序代码上面的程序中我们用同样的格式设计了两种数组:对象数组和简单数据类型数组,以进行比较。数组a只是初始化成一个null的对象名(指针),此时,编译器会禁止我们对这个指针进行任何实际操作。数组b被初始化成指向由Weeble类对象构成的一个数组,但那个数组里实际并未放置任何Weeble对象,所以数组b的元素都是空指针,不能直接使用,然而,我们仍然可以查询那个数组的大小,因为b指向的是一个合法对象。这个程序中还用到对象间的赋值,对象间赋值传递的是指针。孕外孺柯蹬席忠滨镜饲惭寡榔献或家眼条关趁底赃娩彬踊磕激纹捍淮侦补第9章Java的集合类第9章Java的集合类

9.2原集合类4例9.2对象数组的传递这个程序中我们用一个数组来存放香味名(字符串对象),然后从这个数组中随机抽出香味名,形成20个随机排列,并输出。计算中每次都形成一个新的对象数组,并在不同的方法中传递。程序代码flavorSet()方法创建了一个名为results的String数组。该数组的大小为n,具体数值取决于传递给方法的自变量。随后,它从数组flav里随机挑选一些香料(Flavor),并将它们置入results里,并最终返回results。返回数组与返回其他任何对象没什么区别,返回的都是一个指针。另一方面,当flavorSet()随机挑选香料的时候,它需要保证以前挑选过的香料不会再次出现。main()能显示出20个完整的香味名集合,所以我们看到flavorSet()每次都用一个随机顺序选择香料。埠祭鞋书稻何戎贬诀恕馒胳揖散霍览妮堑库茶熔骸魏香汾眩揣袭惭挛幂路第9章Java的集合类第9章Java的集合类例9.2对象数组的传递这个程序中我们用一个数组来存59.2.2Vector类

该类实现了可变数组。和数组一样,它的元素可通过下标进行访问。Vector类的对象通过capacity和capacityIncrement两个值来改变集合的容量,capacity指示集合最多能容纳的元素个数,capacityIncrement指示每次增加多少容量,而不是一个一个增加的。峪做组秽银筐舜辟镊厌才干沂遏棺狐盯达活棠及凡所埋民种嘘沸陶丛势梁第9章Java的集合类第9章Java的集合类9.2.2Vector类该类实现了可变数组。和数组一6这个类有3个属性、多个构造函数和许多其他方法。下面列举几个方法:voidaddElement(Objectobj)——在集合的最后增加一个元素voidadd(intindex,Objectelement)——在指定位置增加一个元素ObjectelementAt(intindex)——返回指定位置的元素voidinsertElementAt(Objectobj,intindex)——在指定位置插入元素voidremoveElementAt(intindex)——删除指定位置的元素intcatacity()——返回当前容量intsize()——返回集合的元素个数嗜诉吵尖诽觉袱亡旨烂肉睹奄翠瘫迢迢墓红位藕玖兰监写坡哀庶嚎严迟注第9章Java的集合类第9章Java的集合类这个类有3个属性、多个构造函数和许多其他方法。下面列举几个方7例9.3集合中元素必须是同类的对象程序代码这个程序中只有在执行((Cat)cats.elementAt(7)).print();的时候抛出例外。在这个程序中也看到了重新造型的格式:(Cat)cats.elementAt(i),因为一个集合的元素是一个Object类的对象,所以必须把它强制转换成Cat类的对象进行操作。退芳南拾努蚜柬钟凰匝让赞河佐趾给宦塞础稻魄畜菇适窘粉颂滥乓饼娩犯第9章Java的集合类第9章Java的集合类例9.3集合中元素必须是同类的对象程序代码退芳南拾努蚜柬8能不能把元素转换成Dog类?

答案是肯定的,把程序中的最后两句换成如下形式,就能把最后一个元素输出。for(inti=cats.size()-1;i>=0;i--)((Dog)cats.elementAt(i)).print();这时的输出结果为:Dog#7Exceptioninthread"main"java.lang.ClassCastException:CatatCatsAndDogs.main(CatsAndDogs.java:31)怎阐羹兰假殖牛砾釉七匙诡斩镭职酗钢掷光鼓吁僵拇蜒椽殆兑犊煞褒骑江第9章Java的集合类第9章Java的集合类能不能把元素转换成Dog类?答案是肯定的,把程序中的最9程序中我们用到了size()这个方法来确定元素的个数,其实有另一个方法可以让程序自动检查元素的类型以及集合的最后一个该类型元素,这就是Enumeration(枚举接口),它是一个简单的反复器(iterator),它能实现对集合的遍历。实现枚举的对象必须通过Vector类的方法elements()来创建,这个方法返回反映当前集合内容的实现枚举的对象。然后通过枚举的方法实现对集合的遍历:ObjectnextElement()

//获得下一个元素,定一次调用返回定一个元素bealoonhasMoreElements()//检查集合中是否有更多的元素檄作钵顺疾喜喊煎况民搀梳垒恕矢啸撇济跪陇丽牲妄参约沁就蝉陆迫酷魔第9章Java的集合类第9章Java的集合类程序中我们用到了size()这个方法来确定元素的个数,其实有10我们就用这两个方法来代替上面的一部分程序,其中改动import语句和主类如下:importjava.util.*;… //这一部分不变 publicclassCatsAndDogs{ publicstaticvoidmain(String[]args){ Vectorcats=newVector(); for(inti=0;i<7;i++) cats.addElement(newCat(i)); cats.addElement(newDog(7)); //以下部分是更新的代码

Enumeratione=cats.elements(); //创建Enumeration对象e while(e.hasMoreElements()) //使用e来完成集合的遍历 ((Cat)e.nextElement()).print(); }}这个程序的输出结果同原先的程序,其中的黑体部分就是更改部分。使用Enumeration,我们不必关心集合中的元素数量。所有工作均由hasMoreElements()和nextElement()自动照管了。垮骚漾囊律炉衡杖拼衬僧栓慈憎护输空洽尽甥惜各镑设井冶钱婪痹丈弊谷第9章Java的集合类第9章Java的集合类我们就用这两个方法来代替上面的一部分程序,其中改动impor119.2.3BitSet类这个类实际是由“二进制位”构成的一个Vector,即这个Vector集合中的元素都是false或true,默认值都为false。此外,BitSet的最小长度是一个长整数(Long)的长度:64位,这意味着假如我们准备保存比它更小的数据,如8位数据,那么BitSet就显得浪费了。湘吴戴舱骗侵贞泊委飘肺蹈德阻泊源央导碟适臣忍硼几面属皑辜纫奇展寐第9章Java的集合类第9章Java的集合类9.2.3BitSet类这个类实际是由“二进制位”12它有以下几个特殊的方法:publicvoidand(BitSetset)——进行逻辑运算,还有or()和xor()publicintlength()——有效逻辑位的位数publicintsize()——返回集合中的元素个数,最小为64publicvoidset(int

bitIndex)——把指定位置的值置为truepublicvoidclear(int

bitIndex)——把指定位置的值置为falsepublicbooleanget(int

bitIndex)——得到制定位置的值概铜砷差毛掺疫嘶卞伎牛烽起僳亏捻细拱幢蠕孙栗傲六谢舜毡胁符请成林第9章Java的集合类第9章Java的集合类它有以下几个特殊的方法:publicvoidand(Bi13例9.4使用BitSet类这段程序的目的是随机产生一个数字串,然后逐一判断它每一个二进制位是否为1,是则在BitSet的相应位置上置true,否则置false888程序代码雀驰烙厄促赦苫未厘歇菇役力职穷裙款昏红偶殿沉努砌该久闪骄刻仿掐杭第9章Java的集合类第9章Java的集合类例9.4使用BitSet类这段程序的目的是随机产生一14

9.2.4Stack类Stack类是Vector类的子类,它是一个“后入先出”(LIFO,last-in-first-out)的集合。Stack的意思就是堆栈,堆栈就像一个桶,只有一个口,放入和取出都用这个口,最后放入的东西能最先拿出,最先放入的东西只能最后拿出。通常在堆栈中存入数据称为“压入”(push),取出数据成为“弹出”(pop)。由于压入和弹出都在堆栈口进行,所以位置很确定,这和其他集合不同。和其他所有Java集合一样,我们压入和弹出的都是对象,所以必须对自己弹出的东西进行造型。琢茧座众秆制敢尘摩侄鹿丧谬侩劝汰齐颈需缘犁东岿仇框已堡唁凸肌劝驻第9章Java的集合类第9章Java的集合类

9.2.4Stack类Stack类是Vecto15这个类增加了5个方法:publicObject

push(Object

item)——把形参对象压入堆栈publicObject

pop()——弹出第一个对象publicObject

peek()——并不取出的情况下,看定一个对象publicbooleanempty()——是否为空publicintsearch(Object

o)——检查第一个出现形参对象的位置橡胰饿逆垫锈囱视佑犁即逞州琳瘤雀维接赤送粳拷巩鹊顷揣畏套卫卵满坏第9章Java的集合类第9章Java的集合类这个类增加了5个方法:publicObjectpush(16例9.5堆栈类的使用

这个程序的目的是将英文的12个月存放到一个Stack中,然后按顺序打印出来。程序代码从这个程序的结果可以清楚地看到,先压入的后弹出,这个类的对象也可以使用Vector类的方法,如addElement()和elementAt()等。嫡拯翻链银砍殃混钡粥嫌醚梨乡赴叭询哆篙彼仅疙乙吸厕霉鬃霖踩鞘踞纵第9章Java的集合类第9章Java的集合类例9.5堆栈类的使用这个程序的目的是将英文的12个179.2.5Hashtable类这个类是字典类(Dictionary)的子类,字典类是抽象类,它达到的目的是通过一个键(key)来查找元素,这和实际的查字典及其相似。整具熔桥费襟坚黍组苏随恋妥入沧侈杂吁订旧博蔡辉耗毋略浊妆漠栅办劫第9章Java的集合类第9章Java的集合类9.2.5Hashtable类这个类是字典类(Di18该抽象类有许多方法,size()告诉我们其中包含了多少元素,isEmpty()判断是否包含了元素(是则为true),put(Objectkey,Objectvalue)添加一个值,并将其同一个键关联起来,get(Objectkey)获得与某个键对应的值,而remove(ObjectKey)用于从列表中删除“键-值”对。还可以使用枚举技术,keys()产生对键的一个枚举(Enumeration),而elements()产生对所有值的一个枚举。Hashtable类不仅实现父类的方法,还有自己的方法,下面这个方法就是用来检查形参对象是否是一个散列表的键:

publicbooleancontainsKey(Object

key)玲株虚缩鹿秘数詹级甭翟饰裴兢犊栏瓮辟窍驱罢冲掌挠哥碗吸麦巴公窟苇第9章Java的集合类第9章Java的集合类该抽象类有许多方法,size()告诉我们其中包含了多少元素,19例9.6用Hashtable来检查随机数的随机性下面的程序将随机整数对应在0~20之间,然后生成10000个随机数,看它们在0~20间的分布如何。

程序代码

这个程序中我们建立一个Hashtable表ht,其中的“键-值”对是随机数(r)与统计数(Counter.i),其中的随机数是键,统计数是值。逊汛掷软丧阶馒飘额哑芹藐桩谦雇橇宣俞凭球跌点甚扩元罩蚜诺违鸽挝票第9章Java的集合类第9章Java的集合类例9.6用Hashtable来检查随机数的随机性下面209.3新集合类集合类继承关系图

事实上这个集合族中分两个部分。一个是Collection系,它是以下标访问元素的集合,它实际含有List和Set两个组件。另一个是Map系,它是一种映射,通过键来访问元素的集合(可见Hashtable是应该属于这个系的),隆蜗柴乞果恨藐丢拖樊泞乃肋昭措催军观调宝脓襟初忘荧埠磺墒镁撑咋问第9章Java的集合类第9章Java的集合类9.3新集合类集合类继承关系图隆蜗柴乞果恨藐丢拖樊泞乃219.3.1CollectionCollection的所有方法:publicintsize()publicbooleanisEmpty()publicbooleancontains(Object

o)——是否含有形参对象publicIterator

iterator()——产生一个反复器,其中包含了该collection对象中所有的元素,类似于一个枚举类型的对象publicObject[]toArray()——返回一个包含所有元素的对象数组publicObject[]toArray(Object[]

a)——把所有元素放入a[]中publicbooleanadd(Object

o)——集合中加入对象,成功时返回truepublicbooleanremove(Object

o) publicbooleancontainsAll(Collection

c)——判断c是否为子集publicbooleanaddAll(Collection

c)publicbooleanremoveAll(Collection

c) ——清空指定集合publicbooleanretainAll(Collection

c)——删除所有c中没有的元素publicvoidclear()——清空集合publicbooleanequals(Object

o)——比较两个对象是否相同publicinthashCode()——获取集合的hashcode邑谎庞猪庐忍塑狙整绳宛葵检淀演低剪跋鹊谅蹈挟喜悟种曼灵獭缚峰腊猪第9章Java的集合类第9章Java的集合类9.3.1CollectionCollection的所有22例9.7Collection的使用这个程序非常简单,只是用来演示大部分的Collection含有的方法,因为这些方法在它的“子类”中都能使用,所以先熟悉这些方法。由于Collection是一个接口,所以它的实例只能是它“子类”的对象。程序代码隘鹅闰糟暮椅倍懂惫液钒庇盯换卞拯箕弟柄憨舒炉远铸顶水尖瑞蹿少芹岁第9章Java的集合类第9章Java的集合类例9.7Collection的使用这个程序非常简单239.3.2ListList的明显特征是它的元素有一个确定的顺序,它比Collection多了一些指定位置增删改的方法。它能产生ListIterator的对象。实现它的类有ArrayList和ArrayList。ArrayList内存中是顺序存储的(元素的内存位置紧邻),而LinkedList内存中是以链表(数据结构中的内容,这里不再讲)的形式存储,所以ArrayList比较适用于经常遍历访问,ArrayList比较适用于经常在中间进行增删改操作。ArrayList是被用来代替Vector的一个通用的可变数组类,因而,Java1.2以后的编程应多使用ArrayList。襟袱骋椽伴人挑腮奔谍膘首考湃嫁磨侧肖兵盂罩翟嘲刀邹萍冕鸵港熟搬厦第9章Java的集合类第9章Java的集合类9.3.2ListList的明显特征是它的元249.3.3SetSet与Collection有完全相同的对外接口,实际上就是一个Collection,但添加到Set的每个元素都必须是独一无二的,Set不会添加重复的元素。添加到Set里的对象必须定义equals()方法,以提供算法来判断欲添加进来的对象是否与已经存在的某对象相等,从而建立对象的惟一性。一个Set不能保证自己可按任何特定的顺序维持自己的元素。实现Set的类有HashSet和TreeSet,HashSet是以hash桶来存放元素,能实现快速查找,TreeSet是一种有顺序的集合,一般以字典式升序排列,或以创建Set时指定的Comparator来排序,内存中以二叉树型结构存储。由于TreeSet实现了SortedSet,所以有几个特殊的方法,例如:publicObjectfirst()——获取第一个即排在最低位的一个publicObjectlast()——获取排在toElement之前的元素组成的SortedSet褐浚沧元啃蓖尸玫到儡车颇占亚邯雀祥灰潍度翁誉晒药词抒函互阿抽窝鸭第9章Java的集合类第9章Java的集合类9.3.3SetSet与Collection有完全相同的25例9.8set中元素的惟一性下面的程序演示Set中的元素是惟一的,即使多次添加同一个值,集合中依然是原来几个。这个程序使用了Collection类中的方法程序代码

与缩腰沥怠役颊袜伶活流踪梅溺芭矢少答躯寒佰乒晦退蝗舰埂饮笑蕾骡扮第9章Java的集合类第9章Java的集合类例9.8set中元素的惟一性与缩腰沥怠役颊袜伶活流踪梅溺269.3.4MapMap这种接口用来维持很多“键-值”对,以便通过一个键查找相应的值。HashMap基于一个散列表实现(用它代替Hashtable)。针对“键-值”对的插入和检索,这种形式具有较好的执行性能。TreeMap

在一个二叉树的基础上实现。查看键或者“键-值”对时,它们会按固定的顺序排列(取决于Comparator)。TreeMap最大的好处就是我们得到的是已排好序的结果。TreeMap是含有subMap()方法的惟一一种Map,利用它可以返回树的一部分。WeakHashMap是一种特殊的HashMap,对于那些弱键,垃圾收集器会自动删除,因而,对应的“键-值”对可能会丢失。节奏麦惩卯蓄惧斤摩沦厕臂萎币戚司软葬盛扒简农罚权讨城骨酸悄纸阎燥第9章Java的集合类第9章Java的集合类9.3.4MapMap这种接口用来维持很多“键-值”对,27例9.9Map的用法

这个程序先定义两个字符串数组,用这些字符串构造Map,并把它的键和值分别输出,然后遍历这个Map,再使用Map的一些方法。程序代码

可见,虽然testData1被放入了两次,但Map对象中并没有重复的数据,当程序调用:Mapm2=fill(newTreeMap(),testData2); m.putAll(m2);我们又可以看到这样的结果:Size=10,Keys:Dopey|Bashful|Belligerent|Sleepy|Lazy|Happy|Comatose|Grumpy|Sneezy|Doc|可见testData2中的数据也放进来了。卵赣休废播徊带铃批旋坪吵刀春测晴这舌楔花抠讲敌戚辗误矽槐立雷坯谅第9章Java的集合类第9章Java的集合类例9.9Map的用法

这个程序先定义两个字符串数组,用这28

9.3.5Utilities1.ArraysArrays类为所有基本数据类型的数组提供了一个重载的sort()和binarySearch(),它们也可用于String和Object。乱谷艰运隋曲挣驰侍巾这住浪闺抒盘洱藤函奖季弗嚼河贞鸳芹灵哦嘴努宵第9章Java的集合类第9章Java的集合类

9.3.5Utilities1.Arrays乱谷艰29例9.10数组工具的使用

这个程序定义了两个重载的方法来产生随机字符串,两个重载的打印方法,main()方法中用随机类产生随机数进行排序和查找,而后用已定义的随机字符串类产生字符串,排序并查找。程序代码对于字符,如果用默认的比较器,会区分大小写。翻嚣肺拘疮内鸣施封阴贤佑气保断刹诺掖啪教廊丈殿悔砌暑呼枫焊扛晾杰第9章Java的集合类第9章Java的集合类例9.10数组工具的使用

这个程序定义了两个重载的方30例9.11自己定义比较方法的sort()

这个程序中把接收的对象转化为字符串,并全部改成小写后进行比较,就不区分大小写了。程序代码这个例子的一个结果为

木澈程鹏九妹潘厘适赂杨赞悲旨摘抱部皂汀奴捐皿款缝艳渠营厢咳棍墓指第9章Java的集合类第9章Java的集合类例9.11自己定义比较方法的sort()

木澈程31例9.12比较对象来排序这个程序定义了一个比较对象的比较器,可能读者会怀疑如何能比较对象,事实上,只是把对象的某一内容(如名称、属性值等)进行比较,读者也可以自己定义。程序代码程序的结果

救淮刨宗月莹饯撼之梁膜伏欧揽乌谦械凝劈环戍骋搞矫钉致嗅慰咕驶愤咏第9章Java的集合类第9章Java的集合类例9.12比较对象来排序这个程序定义了一个比较对象的322.CollectionsCollections类可用与数组相同的形式排序和搜索一个列表(List)。用于排序和搜索列表的静态方法包含在类Collections中,但它们拥有与Arrays中差不多的方法名。sort(List)用于对一个实现了Comparable的对象列表进行排序。binarySearch(List,Object)用于查找列表中的某个对象。sort(List,Comparator)利用一个“比较器”对一个列表进行排序。binarySearch(List,Object,Comparator)则用于查找那个列表中的一个对象。伍含暮漱掖钦诌晤豫朵史猾虏蔚件并碴问链氧窥泌吵空起凯谋裳茂世氖蓑第9章Java的集合类第9章Java的集合类2.CollectionsCollections类可33例9.13排序工具示范

这个例子利用了上面的CompClass,AlphaComp和Collectionx以及Arrayx来示范Collections中的排序工具。程序用了两个不同的ArrayList对象来演示Collections中的排序和查找方法。程序代码执行结果

底帽涌酷父姐歪昂谐侍萨聂倒只蒲盔痕滦檀识骡崭样坞蹬目畏捍弛避精滇第9章Java的集合类第9章Java的集合类例9.13排序工具示范底帽涌酷父姐歪昂谐侍萨聂倒只蒲盔痕349.4练习题1.选择题(1)Vector类的对象中的元素可以是:A. int型整数B. 浮点数C. 对象D. 属性忧连秆期攀蚌案渤帽蛋抓叮竟俩叮依品咳棉欺婿侠沽革骑恫贮祟谷嘻惩列第9章Java的集合类第9章Java的集合类9.4练习题1.选择题忧连秆期攀蚌案渤帽蛋抓叮竟俩35(2) BitSot的最小长度是:A. 8位B. 16位C. 32位D. 64位凄捐臆田纫建侯稀辟趴裔矩圃定淤帕录握八主稻鞘哨迫如晕斋婶艰缚论铡第9章Java的集合类第9章Java的集合类(2) BitSot的最小长度是:凄捐臆田纫建侯稀辟趴裔矩圃362.程序阅读题(1) 阅读下列程序,加入输入参数abracopopstq,会得到什么样的结果?importjava.util.*;publicclassFreq{privatestaticfinalIntegerONE=newInteger(1);publicstaticvoidmain(Stringargs[]){Mapm=newTreeMap();for(inti=0;i<args.length;i++){Integerfreq=(Integer)m.get(args[i]);m.put(args[i],(freq==null?ONE:newInteger(Value()+1)));}System.out.println(m.size()+"distinctwordsdetected:");System.out.println(m);}}座赛哺柏邵氛戴助卒庐衰缆黍狗狠卵恐螺渍侥屠芽炸夏懈姐鹅靳枪汲族浸第9章Java的集合类第9章Java的集合类2.程序阅读题(1) 阅读下列程序,加入输入参数abr373.编程题(1)编制一个程序,用Class类来获取所有关于HashSet类的信息。(2)用ArrarList来实现一个列表,然后用Collections类进行排序、搜索。用不同类型的元素进行试验。(3)用HashMap来检查随机数的分布情况。多芬驴制括懒珐雷瞅窿兼阶剐叉函奎嘴豆痈晕鉴缉魁拖彦喘搅松劫畸旱蹈第9章Java的集合类第9章Java的集合类3.编程题多芬驴制括懒珐雷瞅窿兼阶剐叉函奎嘴豆痈晕鉴缉魁拖38第9章Java的集合类学习重点:集合类与普通数组的区别各种集合类的特点及适用条件炊饮拇拟苯肤晒迫腕鳃反蘸钞拒醋尼敢袱窖卵荡羞滴领毅升釉絮回用阳撬第9章Java的集合类第9章Java的集合类第9章Java的集合类学习重点:炊饮拇拟苯肤晒迫腕鳃反蘸39第9章Java的集合类

9.1集合类概述

9.2原集合类

9.2.1数组

9.2.2Vector类

9.2.3BitSet类

9.2.4Stack类

9.2.5Hashtable类

9.3新集合类

9.3.1Collection

9.3.2List

9.3.3Set

9.3.4Map

9.3.5Utilities

9.4练习题闲双惨扯括悬篮地讨掀沼修叹捂泉斯让盂锌涂惹庆惋谩两屎巢母蹋跨狭冉第9章Java的集合类第9章Java的集合类第9章Java的集合类409.1集合类概述集合类是用来存放某类对象的。我们知道,数组是有固定长度的,在定义数组的时候,就需要确定这个数组的内存空间,但很多时候我们不能确定需要存放多少元素,这时数组就显得很不方便,这时就需要使用集合类。集合类有一个共同特点,就是它们只容纳对象(实际上是对象名,既指向地址的指针),这一点和数组不同,数组可以容纳对象和简单数据。集合类容纳的对象都是Object类的实例,一旦把一个对象置入集合类中,它的类信息将丢失,也就是说,集合类中容纳的都是指向Object类对象的指针。勒饯恳夏刑嫌帧泽墟季燎渡逸躁政藕泻坎锰洒幕淋利烩匆栅被隐况风叁令第9章Java的集合类第9章Java的集合类9.1集合类概述集合类是用来存放某类对象的。我们知道,数41

9.2原集合类9.2.1数组例9.1数组中容纳对象和简单数据这个程序中把对象和简单数据分别作为数组的元素,然后对它们分别操作

程序代码上面的程序中我们用同样的格式设计了两种数组:对象数组和简单数据类型数组,以进行比较。数组a只是初始化成一个null的对象名(指针),此时,编译器会禁止我们对这个指针进行任何实际操作。数组b被初始化成指向由Weeble类对象构成的一个数组,但那个数组里实际并未放置任何Weeble对象,所以数组b的元素都是空指针,不能直接使用,然而,我们仍然可以查询那个数组的大小,因为b指向的是一个合法对象。这个程序中还用到对象间的赋值,对象间赋值传递的是指针。孕外孺柯蹬席忠滨镜饲惭寡榔献或家眼条关趁底赃娩彬踊磕激纹捍淮侦补第9章Java的集合类第9章Java的集合类

9.2原集合类42例9.2对象数组的传递这个程序中我们用一个数组来存放香味名(字符串对象),然后从这个数组中随机抽出香味名,形成20个随机排列,并输出。计算中每次都形成一个新的对象数组,并在不同的方法中传递。程序代码flavorSet()方法创建了一个名为results的String数组。该数组的大小为n,具体数值取决于传递给方法的自变量。随后,它从数组flav里随机挑选一些香料(Flavor),并将它们置入results里,并最终返回results。返回数组与返回其他任何对象没什么区别,返回的都是一个指针。另一方面,当flavorSet()随机挑选香料的时候,它需要保证以前挑选过的香料不会再次出现。main()能显示出20个完整的香味名集合,所以我们看到flavorSet()每次都用一个随机顺序选择香料。埠祭鞋书稻何戎贬诀恕馒胳揖散霍览妮堑库茶熔骸魏香汾眩揣袭惭挛幂路第9章Java的集合类第9章Java的集合类例9.2对象数组的传递这个程序中我们用一个数组来存439.2.2Vector类

该类实现了可变数组。和数组一样,它的元素可通过下标进行访问。Vector类的对象通过capacity和capacityIncrement两个值来改变集合的容量,capacity指示集合最多能容纳的元素个数,capacityIncrement指示每次增加多少容量,而不是一个一个增加的。峪做组秽银筐舜辟镊厌才干沂遏棺狐盯达活棠及凡所埋民种嘘沸陶丛势梁第9章Java的集合类第9章Java的集合类9.2.2Vector类该类实现了可变数组。和数组一44这个类有3个属性、多个构造函数和许多其他方法。下面列举几个方法:voidaddElement(Objectobj)——在集合的最后增加一个元素voidadd(intindex,Objectelement)——在指定位置增加一个元素ObjectelementAt(intindex)——返回指定位置的元素voidinsertElementAt(Objectobj,intindex)——在指定位置插入元素voidremoveElementAt(intindex)——删除指定位置的元素intcatacity()——返回当前容量intsize()——返回集合的元素个数嗜诉吵尖诽觉袱亡旨烂肉睹奄翠瘫迢迢墓红位藕玖兰监写坡哀庶嚎严迟注第9章Java的集合类第9章Java的集合类这个类有3个属性、多个构造函数和许多其他方法。下面列举几个方45例9.3集合中元素必须是同类的对象程序代码这个程序中只有在执行((Cat)cats.elementAt(7)).print();的时候抛出例外。在这个程序中也看到了重新造型的格式:(Cat)cats.elementAt(i),因为一个集合的元素是一个Object类的对象,所以必须把它强制转换成Cat类的对象进行操作。退芳南拾努蚜柬钟凰匝让赞河佐趾给宦塞础稻魄畜菇适窘粉颂滥乓饼娩犯第9章Java的集合类第9章Java的集合类例9.3集合中元素必须是同类的对象程序代码退芳南拾努蚜柬46能不能把元素转换成Dog类?

答案是肯定的,把程序中的最后两句换成如下形式,就能把最后一个元素输出。for(inti=cats.size()-1;i>=0;i--)((Dog)cats.elementAt(i)).print();这时的输出结果为:Dog#7Exceptioninthread"main"java.lang.ClassCastException:CatatCatsAndDogs.main(CatsAndDogs.java:31)怎阐羹兰假殖牛砾釉七匙诡斩镭职酗钢掷光鼓吁僵拇蜒椽殆兑犊煞褒骑江第9章Java的集合类第9章Java的集合类能不能把元素转换成Dog类?答案是肯定的,把程序中的最47程序中我们用到了size()这个方法来确定元素的个数,其实有另一个方法可以让程序自动检查元素的类型以及集合的最后一个该类型元素,这就是Enumeration(枚举接口),它是一个简单的反复器(iterator),它能实现对集合的遍历。实现枚举的对象必须通过Vector类的方法elements()来创建,这个方法返回反映当前集合内容的实现枚举的对象。然后通过枚举的方法实现对集合的遍历:ObjectnextElement()

//获得下一个元素,定一次调用返回定一个元素bealoonhasMoreElements()//检查集合中是否有更多的元素檄作钵顺疾喜喊煎况民搀梳垒恕矢啸撇济跪陇丽牲妄参约沁就蝉陆迫酷魔第9章Java的集合类第9章Java的集合类程序中我们用到了size()这个方法来确定元素的个数,其实有48我们就用这两个方法来代替上面的一部分程序,其中改动import语句和主类如下:importjava.util.*;… //这一部分不变 publicclassCatsAndDogs{ publicstaticvoidmain(String[]args){ Vectorcats=newVector(); for(inti=0;i<7;i++) cats.addElement(newCat(i)); cats.addElement(newDog(7)); //以下部分是更新的代码

Enumeratione=cats.elements(); //创建Enumeration对象e while(e.hasMoreElements()) //使用e来完成集合的遍历 ((Cat)e.nextElement()).print(); }}这个程序的输出结果同原先的程序,其中的黑体部分就是更改部分。使用Enumeration,我们不必关心集合中的元素数量。所有工作均由hasMoreElements()和nextElement()自动照管了。垮骚漾囊律炉衡杖拼衬僧栓慈憎护输空洽尽甥惜各镑设井冶钱婪痹丈弊谷第9章Java的集合类第9章Java的集合类我们就用这两个方法来代替上面的一部分程序,其中改动impor499.2.3BitSet类这个类实际是由“二进制位”构成的一个Vector,即这个Vector集合中的元素都是false或true,默认值都为false。此外,BitSet的最小长度是一个长整数(Long)的长度:64位,这意味着假如我们准备保存比它更小的数据,如8位数据,那么BitSet就显得浪费了。湘吴戴舱骗侵贞泊委飘肺蹈德阻泊源央导碟适臣忍硼几面属皑辜纫奇展寐第9章Java的集合类第9章Java的集合类9.2.3BitSet类这个类实际是由“二进制位”50它有以下几个特殊的方法:publicvoidand(BitSetset)——进行逻辑运算,还有or()和xor()publicintlength()——有效逻辑位的位数publicintsize()——返回集合中的元素个数,最小为64publicvoidset(int

bitIndex)——把指定位置的值置为truepublicvoidclear(int

bitIndex)——把指定位置的值置为falsepublicbooleanget(int

bitIndex)——得到制定位置的值概铜砷差毛掺疫嘶卞伎牛烽起僳亏捻细拱幢蠕孙栗傲六谢舜毡胁符请成林第9章Java的集合类第9章Java的集合类它有以下几个特殊的方法:publicvoidand(Bi51例9.4使用BitSet类这段程序的目的是随机产生一个数字串,然后逐一判断它每一个二进制位是否为1,是则在BitSet的相应位置上置true,否则置false888程序代码雀驰烙厄促赦苫未厘歇菇役力职穷裙款昏红偶殿沉努砌该久闪骄刻仿掐杭第9章Java的集合类第9章Java的集合类例9.4使用BitSet类这段程序的目的是随机产生一52

9.2.4Stack类Stack类是Vector类的子类,它是一个“后入先出”(LIFO,last-in-first-out)的集合。Stack的意思就是堆栈,堆栈就像一个桶,只有一个口,放入和取出都用这个口,最后放入的东西能最先拿出,最先放入的东西只能最后拿出。通常在堆栈中存入数据称为“压入”(push),取出数据成为“弹出”(pop)。由于压入和弹出都在堆栈口进行,所以位置很确定,这和其他集合不同。和其他所有Java集合一样,我们压入和弹出的都是对象,所以必须对自己弹出的东西进行造型。琢茧座众秆制敢尘摩侄鹿丧谬侩劝汰齐颈需缘犁东岿仇框已堡唁凸肌劝驻第9章Java的集合类第9章Java的集合类

9.2.4Stack类Stack类是Vecto53这个类增加了5个方法:publicObject

push(Object

item)——把形参对象压入堆栈publicObject

pop()——弹出第一个对象publicObject

peek()——并不取出的情况下,看定一个对象publicbooleanempty()——是否为空publicintsearch(Object

o)——检查第一个出现形参对象的位置橡胰饿逆垫锈囱视佑犁即逞州琳瘤雀维接赤送粳拷巩鹊顷揣畏套卫卵满坏第9章Java的集合类第9章Java的集合类这个类增加了5个方法:publicObjectpush(54例9.5堆栈类的使用

这个程序的目的是将英文的12个月存放到一个Stack中,然后按顺序打印出来。程序代码从这个程序的结果可以清楚地看到,先压入的后弹出,这个类的对象也可以使用Vector类的方法,如addElement()和elementAt()等。嫡拯翻链银砍殃混钡粥嫌醚梨乡赴叭询哆篙彼仅疙乙吸厕霉鬃霖踩鞘踞纵第9章Java的集合类第9章Java的集合类例9.5堆栈类的使用这个程序的目的是将英文的12个559.2.5Hashtable类这个类是字典类(Dictionary)的子类,字典类是抽象类,它达到的目的是通过一个键(key)来查找元素,这和实际的查字典及其相似。整具熔桥费襟坚黍组苏随恋妥入沧侈杂吁订旧博蔡辉耗毋略浊妆漠栅办劫第9章Java的集合类第9章Java的集合类9.2.5Hashtable类这个类是字典类(Di56该抽象类有许多方法,size()告诉我们其中包含了多少元素,isEmpty()判断是否包含了元素(是则为true),put(Objectkey,Objectvalue)添加一个值,并将其同一个键关联起来,get(Objectkey)获得与某个键对应的值,而remove(ObjectKey)用于从列表中删除“键-值”对。还可以使用枚举技术,keys()产生对键的一个枚举(Enumeration),而elements()产生对所有值的一个枚举。Hashtable类不仅实现父类的方法,还有自己的方法,下面这个方法就是用来检查形参对象是否是一个散列表的键:

publicbooleancontainsKey(Object

key)玲株虚缩鹿秘数詹级甭翟饰裴兢犊栏瓮辟窍驱罢冲掌挠哥碗吸麦巴公窟苇第9章Java的集合类第9章Java的集合类该抽象类有许多方法,size()告诉我们其中包含了多少元素,57例9.6用Hashtable来检查随机数的随机性下面的程序将随机整数对应在0~20之间,然后生成10000个随机数,看它们在0~20间的分布如何。

程序代码

这个程序中我们建立一个Hashtable表ht,其中的“键-值”对是随机数(r)与统计数(Counter.i),其中的随机数是键,统计数是值。逊汛掷软丧阶馒飘额哑芹藐桩谦雇橇宣俞凭球跌点甚扩元罩蚜诺违鸽挝票第9章Java的集合类第9章Java的集合类例9.6用Hashtable来检查随机数的随机性下面589.3新集合类集合类继承关系图

事实上这个集合族中分两个部分。一个是Collection系,它是以下标访问元素的集合,它实际含有List和Set两个组件。另一个是Map系,它是一种映射,通过键来访问元素的集合(可见Hashtable是应该属于这个系的),隆蜗柴乞果恨藐丢拖樊泞乃肋昭措催军观调宝脓襟初忘荧埠磺墒镁撑咋问第9章Java的集合类第9章Java的集合类9.3新集合类集合类继承关系图隆蜗柴乞果恨藐丢拖樊泞乃599.3.1CollectionCollection的所有方法:publicintsize()publicbooleanisEmpty()publicbooleancontains(Object

o)——是否含有形参对象publicIterator

iterator()——产生一个反复器,其中包含了该collection对象中所有的元素,类似于一个枚举类型的对象publicObject[]toArray()——返回一个包含所有元素的对象数组publicObject[]toArray(Object[]

a)——把所有元素放入a[]中publicbooleanadd(Object

o)——集合中加入对象,成功时返回truepublicbooleanremove(Object

o) publicbooleancontainsAll(Collection

c)——判断c是否为子集publicbooleanaddAll(Collection

c)publicbooleanremoveAll(Collection

c) ——清空指定集合publicbooleanretainAll(Collection

c)——删除所有c中没有的元素publicvoidclear()——清空集合publicbooleanequals(Object

o)——比较两个对象是否相同publicinthashCode()——获取集合的hashcode邑谎庞猪庐忍塑狙整绳宛葵检淀演低剪跋鹊谅蹈挟喜悟种曼灵獭缚峰腊猪第9章Java的集合类第9章Java的集合类9.3.1CollectionCollection的所有60例9.7Collection的使用这个程序非常简单,只是用来演示大部分的Collection含有的方法,因为这些方法在它的“子类”中都能使用,所以先熟悉这些方法。由于Collection是一个接口,所以它的实例只能是它“子类”的对象。程序代码隘鹅闰糟暮椅倍懂惫液钒庇盯换卞拯箕弟柄憨舒炉远铸顶水尖瑞蹿少芹岁第9章Java的集合类第9章Java的集合类例9.7Collection的使用这个程序非常简单619.3.2ListList的明显特征是它的元素有一个确定的顺序,它比Collection多了一些指定位置增删改的方法。它能产生ListIterator的对象。实现它的类有ArrayList和ArrayList。ArrayList内存中是顺序存储的(元素的内存位置紧邻),而LinkedList内存中是以链表(数据结构中的内容,这里不再讲)的形式存储,所以ArrayList比较适用于经常遍历访问,ArrayList比较适用于经常在中间进行增删改操作。ArrayList是被用来代替Vector的一个通用的可变数组类,因而,Java1.2以后的编程应多使用ArrayList。襟袱骋椽伴人挑腮奔谍膘首考湃嫁磨侧肖兵盂罩翟嘲刀邹萍冕鸵港熟搬厦第9章Java的集合类第9章Java的集合类9.3.2ListList的明显特征是它的元629.3.3SetSet与Collection有完全相同的对外接口,实际上就是一个Collection,但添加到Set的每个元素都必须是独一无二的,Set不会添加重复的元素。添加到Set里的对象必须定义equals()方法,以提供算法来判断欲添加进来的对象是否与已经存在的某对象相等,从而建立对象的惟一性。一个Set不能保证自己可按任何特定的顺序维持自己的元素。实现Set的类有HashSet和TreeSet,HashSet是以hash桶来存放元素,能实现快速查找,TreeSet是一种有顺序的集合,一般以字典式升序排列,或以创建Set时指定的Comparator来排序,内存中以二叉树型结构存储。由于TreeSet实现了SortedSet,所以有几个特殊的方法,例如:publicObjectfirst()——获取第一个即排在最低位的一个publicObjectlast()——获取排在toElement之前的元素组成的SortedSet褐浚沧元啃蓖尸玫到儡车颇占亚邯雀祥灰潍度翁誉晒药词抒函互阿抽窝鸭第9章Java的集合类第9章Java的集合类9.3.3SetSet与Collection有完全相同的63例9.8set中元素的惟一性下面的程序演示Set中的元素是惟一的,即使多次添加同一个值,集合中依然是原来几个。这个程序使用了Collection类中的方法程序代码

与缩腰沥怠役颊袜伶活流踪梅溺芭矢少答躯寒佰乒晦退蝗舰埂饮笑蕾骡扮第9章Java的集合类第9章Java的集合类例9.8set中元素的惟一性与缩腰沥怠役颊袜伶活流踪梅溺649.3.4MapMap这种接口用来维持很多“键-值”对,以便通过一个键查找相应的值。HashMap基于一个散列表实现(用它代替Hashtable)。针对“键-值”对的插入和检索,这种形式具有较好的执行性能。TreeMap

在一个二叉树的基础上实现。查看键或者“键-值”对时,它们会按固定的顺序排列(取决于Comparator)。TreeMap最大的好处就是我们得到的是已排好序的结果。TreeMap是含有subMap()方法的惟一一种Map,利用它可以返回树的一部分。WeakHashMap是一种特殊的HashMap,对于那些弱键,垃圾收集器会自动删除,因而,对应的“键-值”对可能会丢失。节奏麦惩卯蓄惧斤摩沦厕臂萎币戚司软葬盛扒简农罚权讨城骨酸悄纸阎燥第9章Java的集合类第9章Java的集合类9.3.4MapMap这种接口用来维持很多“键-值”对,65例9.9Map的用法

这个程序先定义两个字符串数组,用这些字符串构造Map,并把它的键和值分别输出,然后遍历这个Map,再使用Map的一些方法。程序代码

可见,虽然testData1被放入了两次,但Map对象中并没有重复的数据,当程序调用:Mapm2=fill(newTreeMap(),testData2); m.putAll(m2);我们又可以看到这样的结果:Size=10,Keys:Dopey|Bashful|Belligerent|Sleepy|Lazy|Happy|Comatose|Grumpy|Sneezy|Doc|可见testData2中的数据也放进来了。卵赣休废播徊带铃批旋坪吵刀春测晴这舌楔花抠讲敌戚辗误矽槐立雷坯谅第9章Java的集合类第9章Java的集合类例9.9Map的用法

这个程序先定义两个字符串数组,用这66

9.3.5Utilities1.ArraysArrays类为所有基本数据类型的数组提供了一个重载的sort()和binarySearch(),它们也可用于String和Object。乱谷

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论