《Java的集合类》PPT课件.ppt_第1页
《Java的集合类》PPT课件.ppt_第2页
《Java的集合类》PPT课件.ppt_第3页
《Java的集合类》PPT课件.ppt_第4页
《Java的集合类》PPT课件.ppt_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

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

文档简介

第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 集合类概述,集合类是用来存放某类对象的。我们知道,数组是有固定长度的,在定义数组的时候,就需要确定这个数组的内存空间,但很多时候我们不能确定需要存放多少元素,这时数组就显得很不方便,这时就需要使用集合类。 集合类有一个共同特点,就是它们只容纳对象(实际上是对象名,既指向地址的指针),这一点和数组不同,数组可以容纳对象和简单数据。 集合类容纳的对象都是Object类的实例,一旦把一个对象置入集合类中,它的类信息将丢失,也就是说,集合类中容纳的都是指向Object类对象的指针。,9.2 原集合类,9.2.1 数组 例9.1 数组中容纳对象和简单数据 这个程序中把对象和简单数据分别作为数组的元素,然后对它们分别操作 程序代码 上面的程序中我们用同样的格式设计了两种数组:对象数组和简单数据类 型数组,以进行比较。 数组a只是初始化成一个null的对象名(指针),此时,编译器会禁止我们对 这个指针进行任何实际操作。 数组b被初始化成指向由Weeble类对象构成的一个数组,但那个数组里实际 并未放置任何Weeble对象,所以数组b的元素都是空指针,不能直接 使用,然而,我们仍然可以查询那个数组的大小,因为b指向的是一 个合法对象。这个程序中还用到对象间的赋值,对象间赋值传递的是 指针。,例9.2 对象数组的传递,这个程序中我们用一个数组来存放香味名(字符串对象),然后从这个数 组中随机抽出香味名,形成20个随机排列,并输出。计算中每次都形成一 个新的对象数组,并在不同的方法中传递。 程序代码 flavorSet()方法创建了一个名为results的String数组。该数组的大小为n,具体数值取决于传递给方法的自变量。随后,它从数组flav里随机挑选一些香料(Flavor),并将它们置入results里,并最终返回results。返回数组与返回其他任何对象没什么区别,返回的都是一个指针。 另一方面,当flavorSet()随机挑选香料的时候,它需要保证以前挑选过的香料不会再次出现。 main()能显示出20个完整的香味名集合,所以我们看到flavorSet()每次都用一个随机顺序选择香料。,9.2.2 Vector类,这个类有3个属性、多个构造函数和许多其他方法。下面列举几个方法:,void addElement(Object obj)在集合的最后增加一个元素 void add(int index,Object element)在指定位置增加一个元素 Object elementAt(int index)返回指定位置的元素 void insertElementAt(Object obj,int index)在指定位置插入元素 void removeElementAt(int 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 - -) (Dog)cats.elementAt(i).print(); 这时的输出结果为: Dog #7 Exception in thread “main“ java.lang.ClassCastException: Cat at CatsAndDogs.main(CatsAndDogs.java:31),程序中我们用到了size()这个方法来确定元素的个数,其实有另一个方 法可以让程序自动检查元素的类型以及集合的最后一个该类型元素,这就 是Enumeration(枚举接口),它是一个简单的反复器(iterator),它能实现 对集合的遍历。实现枚举的对象必须通过Vector类的方法elements()来创 建,这个方法返回反映当前集合内容的实现枚举的对象。然后通过枚举的 方法实现对集合的遍历: 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.addElement(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类,这个类实际是由“二进制位”构成的一个Vector,即这个Vector 集合中的元素都是false或true,默认值都为false。 此外,BitSet的最小长度是一个长整数(Long)的长度:64位, 这意味着假如我们准备保存比它更小的数据,如8位数据,那么 BitSet就显得浪费了。,它有以下几个特殊的方法:,public void and(BitSet set)进行逻辑运算,还有or()和xor() public int length()有效逻辑位的位数 public int size()返回集合中的元素个数,最小为64 public void set(int bitIndex)把指定位置的值置为true public void clear(int bitIndex)把指定位置的值置为false public boolean get(int bitIndex)得到制定位置的值,例9.4 使用BitSet类,这段程序的目的是随机产生一个数字串,然后逐一判断它每一个 二进制位是否为1,是则在BitSet的相应位置上置true,否则置 false 888 程序代码,9.2.4 Stack类,Stack类是Vector类的子类,它是一个“后入先出”(LIFO,last-in-first-out) 的集合。Stack的意思就是堆栈,堆栈就像一个桶,只有一个口,放入和取 出都用这个口,最后放入的东西能最先拿出,最先放入的东西只能最后拿 出。通常在堆栈中存入数据称为“压入”(push),取出数据成为“弹 出”(pop)。由于压入和弹出都在堆栈口进行,所以位置很确定,这和其他 集合不同。和其他所有Java集合一样,我们压入和弹出的都是对象,所以 必须对自己弹出的东西进行造型。,这个类增加了5个方法:,public Object push(Object item)把形参对象压入堆栈 public Object pop()弹出第一个对象 public Object peek()并不取出的情况下,看定一个对象 public boolean empty()是否为空 public int search(Object o)检查第一个出现形参对象的位置,例9.5 堆栈类的使用,这个程序的目的是将英文的12个月存放到一个Stack中,然后按顺序打 印出来。 程序代码 从这个程序的结果可以清楚地看到,先压入的后弹出,这个类的对象也可以使用Vector类的方法,如addElement()和elementAt()等。,9.2.5 Hashtable类,这个类是字典类(Dictionary)的子类,字典类是抽象类,它达 到的目的是通过一个键(key)来查找元素,这和实际的查字典及其 相似。,该抽象类有许多方法,size()告诉我们其中包含了多少元素,isEmpty()判断是否包含了元素(是则为true),put(Object key, Object value)添加一个值,并将其同一个键关联起来,get(Object key)获得与某个键对应的值,而remove(Object Key)用于从列表中删除“键值”对。还可以使用枚举技术,keys()产生对键的一个枚举(Enumeration),而elements()产生对所有值的一个枚举。 Hashtable类不仅实现父类的方法,还有自己的方法,下面这个方法就是用来检查形参对象是否是一个散列表的键: public boolean containsKey(Object key),例9.6 用Hashtable来检查随机数的随机性,下面的程序将随机整数对应在020之间,然后生成10 000个随机数,看 它们在020间的分布如何。 程序代码 这个程序中我们建立一个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(Object o)是否含有形参对象 public Iterator iterator()产生一个反复器,其中包含了该collection对象中所有的元素,类似于一个枚举类型的对象 public Object toArray()返回一个包含所有元素的对象数组 public Object toArray(Object a)把所有元素放入a中 public boolean add(Object o)集合中加入对象,成功时返回true public boolean remove(Object o) public boolean containsAll(Collection c)判断c是否为子集 public boolean addAll(Collection c) public boolean removeAll(Collection c) 清空指定集合 public boolean retainAll(Collection c)删除所有c中没有的元素 public void clear()清空集合 public boolean equals(Object o)比较两个对象是否相同 public int hashCode()获取集合的hashcode,例9.7 Collection的使用,这个程序非常简单,只是用来演示大部分的Collection含有的 方法,因为这些方法在它的“子类”中都能使用,所以先熟悉这些方 法。由于Collection是一个接口,所以它的实例只能是它“子类”的 对象。 程序代码,9.3.2 List,List的明显特征是它的元素有一个确定的顺序,它比Collection多了一些 指定位置增删改的方法。它能产生ListIterator的对象。实现它的类有 ArrayList和ArrayList。ArrayList内存中是顺序存储的(元素的内存位置紧 邻),而LinkedList内存中是以链表(数据结构中的内容,这里不再讲)的形 式存储,所以ArrayList比较适用于经常遍历访问,ArrayList比较适用于 经常在中间进行增删改操作。ArrayList是被用来代替Vector的一个通用的 可变数组类,因而,Java1.2以后的编程应多使用ArrayList。,9.3.3 Set,Set与Collection有完全相同的对外接口,实际上就是一个Collection,但添加到Set的每个元素都必须是独一无二的,Set不会添加重复的元素。添加到Set里的对象必须定义equals()方法,以提供算法来判断欲添加进来的对象是否与已经存在的某对象相等,从而建立对象的惟一性。一个Set不能保证自己可按任何特定的顺序维持自己的元素。 实现Set的类有HashSet和TreeSet,HashSet是以hash桶来存放元素,能实现快速查找,TreeSet是一种有顺序的集合,一般以字典式升序排列,或以创建Set时指定的Comparator来排序,内存中以二叉树型结构存储。由于TreeSet实现了SortedSet,所以有几个特殊的方法,例如: public Object first()获取第一个即排在最低位的一个 public Object last()获取排在toElement之前的元素组成的SortedSet,例9.8 set中元素的惟一性,下面的程序演示Set中的元素是惟一的,即使多次添加同一个值,集合中依然是原来几个。这个程序使用了Collection类中的方法 程序代码,9.3.4 Map,Map这种接口用来维持很多“键值”对,以便通过一个键查找相应的值。 HashMap基于一个散列表实现(用它代替Hashtable)。针对“键值”对的插入和检索,这种形式具有较好的执行性能。 TreeMap 在一个二叉树的基础上实现。查看键或者“键值”对时,它们会按固定的顺序排列(取决于Comparator)。TreeMap最大的好处就是我们得到的是已排好序的结果。TreeMap是含有subMap()方法的惟一一种Map,利用它可以返回树的一部分。 WeakHashMap是一种特殊的HashMap,对于那些弱键,垃圾收集器会自动删除,因而,对应的“键值”对可能会丢失。,例9.9 Map的用法 这个程序先定义两个字符串数组,用这些字符串构造Map,并把它的键和值分别输出,然后遍历这个Map,再使用Map的一些方法。,程序代码 可见,虽然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和Object。,例9.10 数组工具的使用,这个程序定义了两个重载的方法来产生随机字符串,两个重载的打印方 法,main()方法中用随机类产生随机数进行排序和查找,而后用已定义的 随机字符串类产生字符串,排序并查找。 程序代码 对于字符,如果用默认的比较器,会区分大小写。,例9.11 自己定义比较方法的sort(),这个程序中把接收的对象转化为字符串,并全部改成小写后进行 比较,就不区分大小写了。 程序代码 这个例子的一个结果为,例9.12 比较对象来排序,这个程序定义了一个比较对象的比较器,可能读者会怀疑如何能 比较对象,事实上,只是把对象的某一内容(如名称、属性值等)进 行比较,读者也可以自己定义。 程序代码 程序的结果,2. Collections,Collections类可用与数组相同的形式排序和搜索一个列表 (List)。用于排序和搜索列表的静态方法包含在类Collections 中,但它们拥有与Arrays中差不多的方法名。 sort(List) 用于对一个实现了Comparable的对象列表进行排序。 binarySearch(List,Object) 用于查找列表中的某个对象。 sort(List,Comparator) 利用一个“比较器”对一个列表进行排序。 binarySearch(List,Object,Comparator) 则用于查找那个列表中的一个对象。,例9.13 排序工

温馨提示

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

评论

0/150

提交评论