面向对象java实现-06 -2集合与泛型详细_第1页
面向对象java实现-06 -2集合与泛型详细_第2页
面向对象java实现-06 -2集合与泛型详细_第3页
面向对象java实现-06 -2集合与泛型详细_第4页
面向对象java实现-06 -2集合与泛型详细_第5页
免费预览已结束,剩余47页可下载查看

下载本文档

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

文档简介

129十二月2022第6章集合类与泛型程序设计229十二月20226.1Java中的集合类结构

Java提供了集合类(Collection)及其API,于是用户可以通过统一的操作接口,使得从一种数据结构到另一种数据结构的转换极为方便,简化了程序员编程时的负担。任何集合框架包括三部分内容:对外的接口接口的实现对集合运算的算法集合API的根是一个集合接口,存放于java.util包中。Collection接口定义了所有属于集合的类都应该具有的通用方法。329十二月2022

Java集合框架结构由两颗接口树构成:第一棵树根节点为Collection接口,它定义了所有集合的基本操作,如添加、删除、遍历等。它的子接口Set、List等则提供了更加特殊的功能。第二棵树根节点为Map接口。与哈希表类似,保持的是键值对的集合,可以通过键来实现对值元素的快速访问。429十二月2022Collection接口529十二月2022Map接口629十二月2022Collection:每个元素都是单一对象。List以特定顺序容纳元素。Set中不能有重复的元素。Map:每个元素都是一对key-value(键值/实值)对象,且每个元素中的键值都不能与其他元素中的键值相同。729十二月2022集合接口接口描述Collection能使你操作对象数组,它位于集合框架层次结构的顶层List扩展Collection,表示有序的,可包括重复元素的列表Set扩展Collection,表示无序的,无重复元素的集合(数学上的含义)。SortedSet扩展Set,对Set中元素进行排序829十二月2022.2Collection接口Collection接口是构造集合框架的基础。它声明所有集合类都将拥有的核心方法。包含下面几种类型的方法增加元素,清除元素,判断元素的存在返回迭代接口,把集合转换成数组集合的大小929十二月2022.2Collection接口方法名功能说明booleanadd(Objecto)插入单个对象booleanaddAll(Collectionc)添加另外一个集合对象c中的所有对象Object[]toArray()以数组的形式返回内容Object[]toArray(Object[]a)以数组的形式返回内容Iteratoriterator()返回一个实现了Iterator接口的对象voidclear()清空所有对象booleanremove(Objecto)删除指定的对象booleanramoveAll(Collectionc)删除c中所拥有的对象booleanretainAll(Collectionc)保留指定的对象booleancontains(Objecto)检查是否包含有指定的对象booleancontainsAll(Collectionc)检查是否包含c中所包含的对象booleanisEmpty()判断集合是否为空intsize()获取集合中的对象个数例-11029十二月2022.3Set接口Set接口是一种不包含重复元素的Collection的子接口。Set接口中并没有引入新方法,它提供的基本方法和Collection接口类似。Set接口派生了一个SortedSet接口和一个抽象类AbstractSet。

1129十二月2022实现Set接口的类SortedSet接口用来描述有序的元素集合TreeSet实现了这个接口,它将放入其中的元素按序存放,要求其中的对象是可排序的。抽象类AbstractSet实现了部分Collection接口,并有一个子类HashSet,它以散列方式表示集合内容。1229十二月2022HashSet类HashSet扩展AbstractSet并且实现Set接口。它创建了一个使用哈希表存储的集合,能快速定位一个元素,从而可以优化查询的速度,特别是在查找大集合时HashSet类比较有用。该类集使用散列表进行存储。在散列(hashing)中,一个关键字的信息内容被用来确定唯一的一个值,称为散列码(hashcode)。而散列码被用来当作与关键字相连的数据的存储下标。存储在HashSet中的元素必须正确覆盖java.lang.Object中定义的hashCode()方法。HashSet的构造函数如下:HashSet():创建一个空的哈希集。HashSet(Collectionc):创建一个哈希集,并且将集合c中所有元素添加进去。HashSet(intinitialCapacity):创建一个拥有特定容量的空哈希集。HashSet(intinitialCapacity,floatloadFactor):创建一个拥有特定容量和加载因子的空哈希集。1329十二月2022loadFactor是0.01.0之间的一个数,通常默认为0.75。加载因子定义了哈希集合充满什么程度时就要增加容量。即当元素的数目大于哈希集容量和加载因子之积时,哈希集容量将扩展。例:HashSeths=newHashSet();hs.add("A");hs.add("B");hs.add("C");hs.add("D");hs.add("E");hs.add("F");hs.add("A");System.out.println(hs);[D,A,F,C,B,E]从输出结果可以看出,元素并没有按顺序进行存储,并且也没有重复元素。[例-2]1429十二月2022TreeSet类TreeSet为使用树结构进行存储的Set接口提供了一个工具对象按升序存储。访问和检索是很快的。在存储了大量的需要进行快速检索的排序信息的情况下,TreeSet是一个很好的选择。1529十二月2022TreeSet的使用TreeSeths=newTreeSet();hs.add("D");hs.add("E");hs.add("F");hs.add("A");hs.add("B");hs.add("C"); hs.add("A");System.out.println(hs);该程序的输出如下:[A,B,C,D,E,F]TreeSet按树存储其元素,它们被按照自然顺序自动安排,也不能有重复元素[例-3]1629十二月2022.4List接口List接口是包含有序元素的一种Collection子接口,其中的元素必须按序存放。元素之间的顺序关系可以由插入的时间先后决定,也可以由元素值的大小决定。List接口使用类似于数组下标的索引的概念表示元素在List中的位置。用户能够使用索引来访问List中的元素。索引从0开始。为了保持元素的有序的特性,List接口新增加了大量的方法,使之能够在序列中间根据具体位置添加和删除元素。

1729十二月2022List接口的主要方法

方法名功能说明voidadd(intindex,Objectelement)在指定位置上添加一个对象booleanaddAll(intindex,Collectionc)将c中的所有对象添加到指定位置ListIteratorlistIterator()返回一个ListIteratorListIteratorlistIterator(intindex)返回指定的ListIteratorObjectget(intindex)返回指定位置的对象Objectremove(intindex)删除指定位置的对象Objectset(intindex,objectelement)用元素element取代位置index上的元素,返回被取代的元素intindexOf(objecto)返回第一个匹配对象的位置intlastIndexOf(objecto)返回最后一个匹配对象的索引1829十二月2022.4.1LinkedList类类ArrayList、LinkedList、Vector、Stack等实现了List接口。

LinkedList类提供了使用双向链表实现数据存储的方法,可按序号检索数据,并能够进行向前或向后遍历。由于插入数据时只需要记录元素的前后项即可,所以插入数度较快,因此适合于在链表中间需要频繁进行插入和删除的操作。LinkedList的构造方法:LinkedList();创建一个空链表LinkedList(Collectionc);创建一个以集合c中元素为初始值的链表1929十二月2022Linkedlist接口的主要方法

方法名功能说明publicbooleanadd(Objectelement)向链表末尾添加一个新的结点publicbooleanadd(intindex,Objecto)将对象o添加到链表中由index指定位置publicbooleanaddFirst(Objecto)将对象o添加到链表的头部publicbooleanaddLast(Objecto)将对象向o添加到链表的末尾publicbooleanclear()删除链表的所有节点,成为空链表publicObjectremove(intindex)删除指定位置上的结点publicObjectremove(Objecto)删除首次出现含有o的结点publicObjectget(intindex)返回链表中index位置处的结点对象例-42029十二月2022ArrayList类是List接口的一个可变长数组的实现,即一个ArrayList类对象可以动态改变大小。每个ArrayList类对象都有一个容量(Capacity),用于存储元素的数组的大小。容量可随着不断添加新元素而自动增加。序列以初始长度创建,当长度超过时,集合自动变大;当删除对象时,集合自动变小。集合中允许存储null值。ArrayList类的随机访问速度快,但是向表中插入和删除比较慢。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。.4.2ArrayList类2129十二月2022ArrayList常用的构造函数如下:ArrayList():构建一个空的ArrayList对象。ArrayList(Collectionc):构建一个ArrayList对象,并且将集合c中所有元素添加进去。ArrayList(intinitialCapacity):构建一个拥有特定容量的空ArrayList对象。ArrayList的很多成员方法与LinkedList相似,两者的本质区别是一个使用顺序结构,另一个使用链表结构,因此,它也可以使用LinkedList类提供的方法进行列表的操作。例-5.4.2ArrayList类2229十二月2022.5Iterator接口通常希望依次访问类集中的元素。到目前为止,除了使用集合对象的get()方法可以实现对集合中的元素的遍历外,处理这个问题的最简单方法是使用iterator,Iterator是一个或者实现Iterator或者实现ListIterator接口的对象。Iterator可以遍历类集中的元素,从而获得或删除元素。ListIterator扩展Iterator,允许双向遍历列表,并可以修改。

2329十二月2022Iterator接口的主要方法

方法名功能说明booleanhasNext()判断是否还有其他元素Objectnext()获取下一个元素voidremove()删除最后一次调用next方法返回的元素SetkeySet()返回Set类型的接口2429十二月2022Iterator迭代器只能前向循环,如果需要双向遍历,则可以使用更高级的ListIterator迭代器,ListIterator接口继承自Iterator接口。ListIterator迭代器除了有next()方法外,还新增了hasprevious()方法和previous()方法,实现前向遍历。ListIterator还可以定位当前的索引位置,调用nextIndex()和previousIndex()就可以实现。

ListIterator迭代器2529十二月2022ListIterator接口的主要方法方法名功能说明voidadd(Objecto)插入新的对象voidset(Objecto)修改最后一次调用next方法返回的元素voidremove()删除最后一次调用next方法返回的元素booleanhasPrevious()判断前面是否还有元素Objectprevious()获取前一个对象intnextIndex()获取下一个元素的索引值intpreviousIndex()获取上一个元素的索引值2629十二月2022Iterator使用ArrayListal=newArrayList();Iteratoritr=al.iterator(); while(itr.hasNext()) { Objectelement=itr.next(); System.out.print(element+""); }详细例-6使用Iterator的一般步骤:调用集合对象的Iterator()方法得到一个指向集合序列第一个元素的迭代器;设置一个调用hasNext()方法的循环,序列中是否还有元素。如果集合中还有元素,hasNext()返回true;在循环中,使用next()方法获得集合序列中的下一个元素;如果需要删除元素,可remove()方法将迭代器所返回的元素删除。Remove()方法删除next()方法最后一次从集合中访问的元素。2729十二月2022.6Map及HashMap接口

1.Map接口

Map中每项都是成对出现的,它提供了一组键值的映射即一个存储关键字和值的关联或者说是关键字/值对的对象。存储的每个对象都有一个相应的关键字(key),关键字决定了对象在Map中的存储位置。给定一个关键字,可以得到它的值。关键字和值都是对象,每一对关键字/值,叫做一项。关键字应该是唯一的,但值是可以被重复的,且每个key只能映射一个value。用put(Objectkey,Objectvalue)方法即可将一个键与一个值对象相关联。用get(Objectkey)可得到与此key对象所对应的值对象。有些映射可以接收null关键字和null值。而有的则不行2829十二月2022Map接口的主要方法

方法名功能说明Objectput(Objectkey,Objectvalue)插入新的对象,并用key作为其键字voidputAll(Mapt)将另一个Map中的所有对象复制进来SetentrySet()返回映射中的关键字-值对的集合SetkeySet()返回映射中所有关键字的集合Collectionvalues()返回映射中所有值的集合Objectremove(Objectkey)删除指定的对象Objectget(Objectkey)获取与key相联系的对象booleancontainsKey(Objectkey)判断是否包含指定的键值booleancontainsValue(Objectvalue)判断是否包含指定的对象2929十二月2022Map接口的一个抽象类是AbstractMap。在这个抽象类中,部分地实现了Map接口中的成员方法,使得具体的映射类不必实现Map接口中的每个成员方法。AstractMap抽象类有三个子类:TreeMapHashMapWeakHashMap:

AstractMap抽象类3029十二月2022

(1)TreeMap描述了一个按键值升序排列的映射,它有一些扩展的方法,如firstKey(),lastKey()等,还可以从TreeMap中指定一个范围以取得其子Map。

(2)HashMap描述的一个映射中允许存储空对象,由于键必须唯一,所以只能有一个空键值。(3)WeakHashMap是一种改进的HashMap,它描述了一个映射,当集合中的某些内容不再使用时需清除掉无用的数据,并使用垃圾回收机制进行回收。AstractMap抽象类3129十二月2022HashMap类使用散列表实现Map接口HashMap通过哈希运算可以快速查找一个键,因此在适合于在Map中插入、删除和定位元素。如果要按照自然顺序或者自定义顺序遍历关键字,TreeMap会更好些。

2.HashMap

3229十二月2022由于HashMap实现了Map接口,因此它没有自己的新方法。HashMap的构造方法如下:HashMap():创建一个空的HashMap集合。HashMap(Mapt):创建一个哈希集,将t中所有元素添加进去。HashMap(intinitialCapacity):创建一个拥有特定容量的空HashMap集合。HashMap(intinitialCapacity,floatloadFactor):创建一个拥有特定容量和加载因子的空HashMap。3329十二月2022

散列表中的容量是指能够存储对象的数量。当对象存储的数目到达容量乘以加载因子的值时,容量将会自动地增加到原容量的2倍加1,加1的目的是确保散列表的容量为质数或奇数。例如:HashMapaMap=newHashMap(151,0.6f);

aMap对象最初的容量为151,当存储对象的数量达到1时,容量将会自动增加到303。3429十二月2022HashMap类的主要成员方法方法描述Objectput(Objectkey,Objectvalue)用键值key存储对象valuevoidputAll(Mapmap)将map中的所有键值/对象传递给当前的散列表Objectget(Objectkey)返回键值key所对应的对象remove(Objectkey)删除key键值所对应的对象SetKeySet()返回一个Set对象,其内容为所有的键值SetentrySet()返回一个Set对象,其内容为所有的键值/对象对Collectionvalues()返回一个Collection对象,其内容为散列表中存储的所有对象ObjectgetKey()返回对象的键值ObjectgetValue()返回所对应的对象voidsetValue(Objectnew)将对象设置为new3529十二月2022例:HashMaphm=newHashMap //把元素加入映射

hm.put("John",newInteger(66)); hm.put("Tom",newInteger(67)); hm.put("Jane",newInteger(68));例6-73629十二月20223.TreeMap类

TreeMap类通过使用树实现Map接口。允许快速检索。应该注意的是,不像散列映射,树映射保证它的元素按照关键字升序排序。下面的TreeMap构造函数定义为:TreeMap()TreeMap(Comparatorcomp)TreeMap(Mapm)TreeMap(SortedMapsm)3729十二月2022TreeMap的使用TreeMaptm=newTreeMap(); //放入元素

tm.put("E",newDouble(3444.44)); tm.put("A",newDouble(3444.34)); tm.put("B",newDouble(124.22)); tm.put("C",newDouble(1338.00));Iterator<String>i=set.iterator(); while(i.hasNext()) { Stringkey=i.next(); System.out.println(key+":"+tm.get(key).doubleValue()); }3829十二月2022

Vector(向量)是Java.util包提供的工具类,是类似数组的一种顺序存储的数据结构。它允许将不同类型的元素存储在一个向量中,而且元素的个数可变,因此Vector类提供了实现可增长数组的功能,以适应创建Vector对象后进行添加或删除的操作,使得应用程序的操作方式变得更加方便、灵活。6.7Vector类3929十二月2022Vector类适合在如下情况中使用:需要处理的对象数目不确定,序列中的元素都是对象或者可以表示为对象。需要将不同类的对象组合成一个数据序列需要在对象序列中频繁地插入和删除需要经常定位元素或者进行其他查询操作在不同类之间传递大量数据。4029十二月20221.创建Vector类的对象

Vector类有如下4个构造函数:publicVector():创建最多允许存放10个元素的向量,每次扩展向量元素的数目为原向量元素数目的一倍。publicVector(intinitialCapacity):创建最多允许存放initialCapacity个元素的向量,每次扩展向量元素的数目为原向量元素数目的一倍。

4129十二月2022

publicVector(intinitialCapacity,intcapacityIncrement):创建最多允许存放initialCapacity个元素的向量,每次扩展向量元素的数目为capacityIncrement。publicVector(Collectionc):创建最多允许比参数带入的集合c的元素数目多10%的向量,每次扩展向量元素的数目为原向量元素数目的一倍。4229十二月2022

其中,initialCapacity表示刚创建时Vector序列包含的元素数目;capacityIncrement表示向Vector序列中追加元素时每次增加的个数。下面是几个创建向量对象的例子。VectorvectorObject1=newVector();VectorvectorObject2=newVector(200);VectorvectorObject3=newVector(200,15);在使用Vector时,需要特别注意的是先创建后使用,否则容易造成溢出或者空指针异常4329十二月2022

Vector类的主要成员方法(1)成员方法描述intcapacity()返回当前向量所允许存放的元素数目,通常被称为向量容量。intsize()返回向量中当前的元素数目。voidcopyInto(ObjectanArray[])将向量中的元素复制到anArray数组中。intindexOf(Objectelem)将从前向后搜索对象elem。ObjectelementAt(intindex)这个成员方法将返回向量下标为index对应的元素。voidsetElementAt(Objectobj,intindex)将对象obj存放到下标为index的位置。voidremoveElementAt(intindex)删除下标为index的对象,后面的元素依次向前移动一个位置。voidinsertElementAt(Objectobj,intindex)在下标为index处插入对象obj,原index处以后的元素依次向后移动一个位置。voidaddElement(Objectobj)将对象obj追加在向量的尾部4429十二月2022

Vector类的主要成员方法(2)成员方法描述booleanremoveElement(Objectobj)从向量中删除第一次出现的obj对象。Objectclone()实现向量复制Objectget(intindex)返回下标为index的向量元素。booleanadd(Objecto)将对象o追加在向量的尾部voidadd(intindex,Objectobj)将新元素添加到指定的位置Objectremove(intindex)删除index位置的对象。如果index非法,抛出ArrayIndexOutOfBoundsExceptio异常StringtoString()将向量元素用字符串形式表示例6-84529十二月20226.8Stack类在Java语言中,Stack类是java.util包中专门用来实现栈的工具类。Stack类继承自Vector类,因此它是Vector的一个子类,实现了一个后进先出的堆栈。Stack类继承了Vector类的所有方法,还新增了一些方法使得Vector类能够实现堆栈的操作。4629十二月20221、创建Stack类对象publicStack();它建立一个空的堆栈2、压栈与出栈操作publicObjectpush(Objectitem):将指定的对象压入栈publicObjectpop():将栈顶的对象从栈中取出3、检查栈是否为空publicbooleanempty():测试堆栈是否为空,若堆栈中没有对象元素,则返回true,否则返回false4、查看栈顶端的数据,但不删除该数据。publicobjectpeek()5、获取数据在堆栈中的位置。最顶端的位置是1,向下依次增加。如果堆栈不含有此数据,则返回-1。publicsearch(Objectdata)例6-64729十二月2022泛型是JDK1.5以上版本的新特性,泛型的本质是参数化类型,也就是说所操作的数据类型被指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口和泛型方法。它在使用集合时,提供了一种编译时类型安全检查功能,并能减少类型强制转化的麻烦。当你从一个集合中取出一个元素时,例如使用Iterator接口中的next()方法,其返回值的类型是Object,在使用这个元素时,需要把返回值转换为元素本身的类型。这种类型转化是不安全的。这种转换是要求开发者对实际参数类型可以预知的情况下进行的。对于强制类型转换错误的情况,编译器可能不提示错误,但在运行的时候可能会出现异常,这是一个安全隐患。泛型的引入很好地解决了这一问题6.6泛型程序设计4829十二月2022泛型类的定义泛型类的定义:

classjava_generics<T><>里边的T的类型可以是任意的,由实际对象的类型决定。而在使用泛型类时,通过<>内的参数指定参数类型。4929十二月2022未使用泛化的代码ArrayLista=newArrayList();a.add(newInteger(1));a.add(newInteger(2));for(Itera

温馨提示

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

评论

0/150

提交评论