




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第7章对象群体的组织2目录7.1对象数组7.3集合(Collection,Map)7.4本章小结7.1对象数组数组在Java提供的存储及随机访问对象序列的各种方法中,数组是效率最高的一种类型检查边界检查优点数组知道其元素的类型编译时的类型检查大小已知代价数组对象的大小是固定的,在生存期内大小不可变37.1对象数组(续)
——对象数组的初始化在声明和定义数组的同时对数组元素进行初始化,例如:BankAccount[]accounts={newBankAccount(“Zhang",100.00),newBankAccount(“Li",2380.00),newBankAccount(“Wang",500.00),newBankAccount(“Liu",175.56),newBankAccount(“Ma",924.02)};先定义再初始化,需要经过两步:首先给数组分配空间typearrayName[]=newtype[arraySize];然后给每一个数组元素分配空间arrayName[0]=newtype(paramList);…arrayName[arraySize-1]=newtype(paramList);57.1对象数组(续)数组的优点是Java提供的随机访问对象序列的最有效方法是一个简单的线性序列,访问元素的速度较快数组的缺点大小自创建以后就固定了,在其整个生存期内其大小不可改变数组元素只能是同一类型67.3.1Java集合框架集合框架(JavaCollectionsFramework)为表示和操作集合而规定的一种统一的标准的体系结构提供了一些现成的数据结构可供使用,程序员可以利用集合框架快速编写代码,并获得优良性能将具有相同性质的一类对象,汇聚成一个整体可动态改变其大小包含三大块内容对外的接口:表示集合的抽象数据类型接口的实现:指实现集合接口的Java类,是可重用的数据结构对集合运算的算法:是指执行运算的方法,例如在集合上进行查找和排序77.3集合7.3.1Java集合框架(续)
——对外的接口集合框架接口声明了对各种集合类型执行的一般操作包括Collection、Set、List、Queue、SortedSet、Map、SortedMap基本结构如图87.3集合7.3.1Java集合框架(续)
——Collection接口修改方法包括booleanadd(Objectobj)–向集合中增加对象booleanaddAll(Collection<?>c)–将参数集合中的所有元素增加到接收者集合中booleanremove(Objectobj)–从集合中删除对象booleanremoveAll(Collectionc)-将参数集合中的所有元素从接收者集合中删除booleanretainAll(Collectionc)–在接收者集合中保留参数集合中的所有元素,其它元素都删除voidclear()–删除集合中的所有元素107.3集合7.3.1Java集合框架(续)
——SortedSet接口一种特殊的Set其中的元素是升序排列的,还增加了与次序相关的操作通常用于存放词汇表这样的内容实现它的类:ConcurrentSkipListSet,TreeSet127.3.1Java集合框架(续)
——Queue接口除了Collection的基本操作,队列接口另外还有插入、移除和查看操作。FIFO(first-in-first-out)实现它的类LinkedList同时也实现了List,前进先出PriorityQueue按元素值排序的队列其他:AbstractQueue,ArrayBlockingQueue,ArrayDeque,ConcurrentLinkedQueue,DelayQueue,LinkedBlockingDeque,LinkedBlockingQueue,PriorityBlockingQueue,SynchronousQueue147.3.1Java集合框架(续)
——Map接口用于维护键/值对(key/valuepairs)描述了从不重复的键到值的映射其中不能有重复的关键字,每个关键字最多能够映射到一个值声明时可以带有两个参数,即Map<K,V>,其中K表示关键字的类型,V表示值的类型实现它的类HashMap,TreeMap,其他:AbstractMap,Attributes,AuthProvider,ConcurrentHashMap,ConcurrentSkipListMap,EnumMap,Hashtable,IdentityHashMap,LinkedHashMap,PrinterStateReasons,Properties,Provider,RenderingHints,SimpleBindings,TabularDataSupport,UIDefaults,WeakHashMap157.3集合7.3.1Java集合框架(续)
——SortedMap接口一种特殊的Map,其中的关键字是升序排列的与SortedSet对等的Map,通常用于词典和电话目录等在声明时可以带有两个参数,即SortedMap<K,V>,其中K表示关键字的类型,V表示值的类型实现它的类TreeMap,ConcurrentSkipListMap167.3.1Java集合框架(续)
——接口的实现:常用的集、列表、队列类抽象类AbstractCollection<E>实现接口Collection<E>177.3集合7.3.1Java集合框架(续)
——接口的实现:常用的映射抽象类AbstractMap实现Map接口18MapSortedMapAbstractMapHashMapTreeMapWeakHashMapHashTableAttributesIdentityHashMapRenderingHintsDictionary7.3.1Java集合框架(续)
——对集合运算的算法洗牌算法shuffle其作用与排序算法恰好相反,它打乱List中的任何次序。也就是说以随机方式重排元素,任何次序出现的几率都是相等的在实现偶然性游戏的时候,这个算法很有用,例如洗牌常规数据处理算法reverse:将一个List中的元素反向排列fill:用指定的值覆写List中的每一个元素,这个操作在重新初始化List时有用copy:接受两个参数,目标List和源List,将源中的元素复制到目标,覆写其中的内容。目标List必须至少与源一样长,如果更长,则多余的部分内容不受影响207.3集合7.3.1Java集合框架(续)
——对集合运算的算法查找算法binarySearch使用二分法在一个有序的List中查找指定元素有两种形式第一种形式假定List是按照自然顺序升序排列的第二种形式需要增加一个Comparator对象,表示比较规则,并假定List是按照这种规则排序的。检查集合是否实现了RandomAccess接口。是:二分法查找。否:线性查找217.3集合7.3.1Java集合框架(续)
——数组实用方法Arrays类Java集合框架提供了一套专门用于操作数组的实用方法,它们作为静态方法存在该类中还包括可以将数组视为列表(List)的静态工厂常用方法fill(type[]a,typeval):给数组填充,就是简单地把一个数组全部或者某段数据填成一个特殊的值equals(type[]a,type[]b):实现两个数组的比较,相等时返回truesort(type[]a):对数组排序binarySearch(
):对数组元素进行二分法查找Arrays.asList(Object[]a):实现数组到ArrayList的转换237.3集合7.3.1Java集合框架(续)
——数组实用方法数组的填充和复制importjava.util.*;publicclassCopyingArrays{publicstaticvoidmain(String[]args){int[]i=newint[25];int[]j=newint[25];Arrays.fill(i,47);Arrays.fill(j,99);
System.arraycopy(i,0,j,0,i.length);int[]k=newint[10];Arrays.fill(k,103);
System.arraycopy(i,0,k,0,k.length);Arrays.fill(k,103);System.arraycopy(k,0,i,0,k.length);Integer[]u=newInteger[10];Integer[]v=newInteger[5];Arrays.fill(u,newInteger(47));Arrays.fill(v,newInteger(99));System.arraycopy(v,0,u,u.length/2,v.length);}}JDK1.5,可使用Arrays.toString函数方便的显示出数组的内容247.3集合7.3.2向量(Vector,ArrayList)Vector/ArrayList实现了Collection接口的具体类能够存储任意对象,但通常情况下,这些不同类型的对象都具有相同的父类或接口不能存储基本类型(primitive)的数据,除非将这些数据包裹在包裹类中其容量能够根据空间需要自动扩充增加元素方法的效率较高,除非空间已满,在这种情况下,在增加之前需要先扩充容量Vector:集合框架中的遗留类,旧线程安全集合,已弃用。ArrayList方法是非同步的,效率较高Java提供了线程安全集合:Java.util.concurrent包,映像、有序集、队列任何集合类通过使用同步包装器可以变成线程安全的:List<E>synchArrayList=Collections.synchronisedList(newArrayList<E>());267.3集合7.3.2向量(Vector,ArrayList)(续)
——构造方法Vector类的构造方法VectormyVector=newVector();//初始容量为10VectormyVector=newVector(intcap);VectormyVector=newVector(Collectioncol);以参数col中的元素进行初始化也可用数组元素生成,但需先将数组转换成List对象,如String[]num={"one","two","three","four","five"};VectoraVector=newVector(java.util.Arrays.asList(num));ArrayList的构造方法与Vector类似ArrayListmyList=newArrayList();ArrayListmyList=newArrayList(intcap);ArrayListmyList=newArrayList(Collectioncol);277.3集合28本节所有常用方法如无特殊说明,为Vector,ArrayList类共有之方法voidadd(Objectobj)——添加一个对象,如Vector<String>teamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");booleanaddAll(Collectioncol)——添加整个集合,如果接收者对象的结果有变化,则返回true,如Vector<String>teamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");VectoryourList=newVector();yourList.addAll(teamList);
7.3集合7.3.2向量(Vector,ArrayList)(续)
——常用方法17.3.2向量(Vector,ArrayList)(续)
——常用方法3voidset(intpos,Objectobj)——用参数对象替换指定位置的对象,如Vector<String>teamList=newVector();teamList.add("ZhangWei");teamList.add("LiHong");teamList.add("YuHongshu");teamList.set(2,"LiuNa");System.out.println(teamList);//显示[ZhangWei,LiHong,LiuNa]teamList.set(3,"MaLi");//产生例外ArrayIndexOutOfBoundsException307.3集合7.3.2向量(Vector,ArrayList)(续)
——常用方法4booleanremove(Objectobj)——去除给定对象的第一次出现,如果找到了对象,则返回true。去除一个对象后,其后面的所有对象都依次向前移动。如Vector<String>teamList=newVector();
teamList.add("ZhangWei");
teamList.add("LiHong");teamList.add("YuHongshu");teamList.remove("LiHong");teamList.remove("WangHong");//不做任何事,也不出现错误System.out.println(teamList);//显示[ZhangWei,YuHongshu]317.3集合7.3.2向量(Vector,ArrayList)(续)
——常用方法5Objectremove(intpos)——去除给定位置的元素,并返回被去除的对象。如Vector<String>teamList=newVector();
teamList.add("ZhangWei");
teamList.add("LiHong");teamList.add("YuHongshu");teamList.remove(0);//去除ZhangWeiteamList.remove(0);//去除LiHongSystem.out.println(teamList);//显示[YuHongshu]teamList.remove(1);//产生例外ArrayIndexOutOfBoundsException327.3集合7.3.2向量(Vector,ArrayList)(续)
——常用方法6booleanremoveAll(Collection<?>col)——从接收者对象中去除所有在参数对象中出现的元素,如果接收者对象的结果有变化,则返回true。如Vector<String>teamList=newVector();
teamList.add("ZhangWei");
teamList.add("LiHong");teamList.add("YuHongshu");Vector<String>yourList=newVector();
yourList.add("YuHongshu");
yourList.add("HeLi");yourList.add("ZhangWei");teamList.removeAll(yourList);System.out.println(teamList);//显示[LiHong]337.3集合7.3.2向量(Vector,ArrayList)(续)
——常用方法7voidclear()——去除所有的元素booleancontains(Objectobj)——返回是否包含指定的对象,如果包含则返回true;否则,返回falsebooleancontainsAll(Collection<?>col)——返回是否包含参数col中的所有对象intindexOf(Objectobj)——返回给定对象在Vector/ArrayList中第一次出现的位置,如不存在,则返回-1。如Vector<String>teamList=newVector();
teamList.add("ZhangWei");
teamList.add("LiHong");teamList.indexOf("LiHong");//返回1。teamList.indexOf("ZhangLi");//返回-1。347.3集合7.3.2向量(Vector,ArrayList)(续)
——常用方法8Enumerationelements()——返回包含Vector中所有元素的Enumeration类对象。该方法只能应用于Vector对象,不能应用于ArrayList对象。如Vector<String>teamList=newVector();
teamList.add("ZhangWei");
teamList.add("LiHong");teamList.add("YuHongshu");teamList.elements();//返回Enumeration类对象。Iteratoriterator()——返回包含Vector/ArrayList中所有元素的Iterator类对象357.3集合7.3.2向量(Vector,ArrayList)(续)
——使用Vector存取对象如果声明Vector时不指定Vector中元素的类型,那么当使用get()方法取出Vector中的元素时,get()方法返回的类型都是Object类型。如果声明Vector时指定了Vector中元素的类型,则使用get方法后取出的元素就是指定的类型,且不能塑型成其他类型。当使用get()方法取出Vector中的元素时,返回的类型都是Object类型。Vector的使用者需要记住存入对象的具体类型,当使用get()方法取出后,再塑型成其本来的类型。367.3集合377.3.2向量(Vector,ArrayList)(续)
——使用Vector存取对象例如,创建Vector类对象时不指定元素的类型:String[]
names={"Zhang","Li","Wang","Zhao"};Vectorv=newVector();for(inti=0;i<names.length;i++){
Customerc=newCustomer();
c.setName(names[i]);
v.add(c);}则使用get()方法将Customer对象从Vector中取出后,需要再塑型成Customer类。代码如下:for(inti=0;i<v.size();i++){
Customerc=(Customer)v.get(i);
System.out.println(c.getName());}7.3集合7.3.3Enumeration及Iterator接口集合类对象中每个元素的遍历方法for(inti=0;i<v.size();i++){
Customerc=(Customer)v.get(i);
System.out.println(c.getName());}Enumeration/Iterator能够从集合类对象中提取每一个元素,并提供了用于遍历元素的方法Java中的许多方法(如elements())都返回Enumeration类型的对象,而不是返回集合类对象Enumeration接口不能用于ArrayList对象,而Iterator接口既可以用于ArrayList对象,也可以用于Vector对象387.3集合7.3.3Enumeration及Iterator接口(续)
——Enumeration接口Enumeration接口(1.0版)提供了两个实例方法hasMoreElements()——判断是否还有剩下的元素;nextElement()——取得下一个元素。遍历集合类对象v中的每个元素可使用下面代码完成:Enumeration<Customer>e=v.elements();while(e.hasMoreElements()){
Customerc=v.nextElement();
System.out.println(c.getName());}397.3集合7.3.3Enumeration及Iterator接口(续)
——例7-7Enumeration类使用举例importjava.util.Vector;importjava.util.Enumeration;publicclassEnumerationTester{publicstaticvoidmain(Stringargs[]){Enumeration<String>days;Vector<String>dayNames=newVector<String>();dayNames.add("Sunday");dayNames.add("Monday");dayNames.add("Tuesday");dayNames.add("Wednesday");dayNames.add("Thursday");dayNames.add("Friday");dayNames.add("Saturday");days=dayNames.elements();while(days.hasMoreElements()){System.out.println(days.nextElement());}}}407.3集合7.3.3Enumeration及Iterator接口(续)
——例7-7运行结果运行结果SundayMondayTuesdayWednesdayThursdayFridaySaturday常见编程错误在一次循环中调用两次nextElement()方法在遍历的过程中从集合对象中去除元素,具体见例7-8417.3集合7.3.3Enumeration及Iterator接口(续)
——例7-8Enumeration类的问题举例importjava.util.Vector;importjava.util.Enumeration;publicclassEnumerationTester2{publicstaticvoidmain(Stringargs[]){String[]num={"one","two","three","four","five","six","seven","eight","nine","ten"};Vector<StringaVector=newVector<String>(java.util.Arrays.asList(num));System.out.println("BeforeVector:"+aVector);Enumeration<String>nums=aVector.elements();
while(nums.hasMoreElements()){StringaString=(String)nums.nextElement();System.out.println(aString);if(aString.length()>4)aVector.remove(aString);}System.out.println("AfterVector:"+aVector);}}427.3集合7.3.3Enumeration及Iterator接口(续)
——例7-8运行结果运行结果BeforeVector:[one,two,three,four,five,six,seven,eight,nine,ten]onetwothreefivesixsevenninetenAfterVector:[one,two,four,five,six,
eight,nine,ten]可见,长度大于4的字符串并没有如预期的那样都从向量中去除。这是Enumeration类存在的问题。因此,如果需要在遍历的过程中去除对象,就不要使用Enumeration类437.3集合7.3.3Enumeration及Iterator接口(续)
——Iterator接口Iterator接口(1.2版,替代Enumeration)也是一个遍历集合元素的工具,是对Enumeration接口的改进,因此在遍历集合元素时,优先选用Iterator接口与Enumeration不同,具有从正在遍历的集合中去除对象的能力具有如下三个实例方法,可见相对于Enumerationo接口简化了方法名hasNext()
——判断是否还有元素next()
——取得下一个元素remove()——去除一个元素。注意是从集合中去除最后调用next()返回的元素,而不是从Iterator类中去除447.3集合7.3.3Enumeration及Iterator接口(续)
——例7-9Iterator类使用举例importjava.util.Vector;importjava.util.Iterator;publicclassIteratorTester{publicstaticvoidmain(Stringargs[]){String[]num={"one","two","three","four","five","six","seven","eight","nine","ten"};Vector<String>aVector=newVector<String>(java.util.Arrays.asList(num));System.out.println("BeforeVector:"+aVector);Iterator<String>nums=aVector.iterator();while(nums.hasNext()){StringaString=(String)nums.next();System.out.println(aString);if(aString.length()>4)nums.remove();}System.out.println("AfterVector:"+aVector);}}457.3集合7.3.3Enumeration及Iterator接口(续)
——例7-9运行结果运行结果BeforeVector:[one,two,three,four,five,six,seven,eight,nine,ten]onetwothreefourfivesixseveneightninetenAfterVector:[one,two,four,five,six,nine,ten]在遍历的过程中,Iterator类对象能够与其对应的集合对象保持一致,没有元素被遗漏,因此能够得到正确的结果467.3集合477.3.4增强for循环遍历集合除了Enumeration及Iterator类之外,也可以使用增强for循环来遍历集合类对象中的每一个元素格式for(Typea:集合对象)7.3集合487.3.4增强for循环遍历集合
——例7-10importjava.util.Vector;importjava.util.Enumeration;publicclassForTester{publicstaticvoidmain(Stringargs[]){Enumeration<String>days;Vector<String>dayNames=newVector();dayNames.add("Sunday");dayNames.add("Monday");dayNames.add("Tuesday");dayNames.add("Wednesday");dayNames.add("Thursday");dayNames.add("Friday");dayNames.add("Saturday");days=dayNames.elements();for(Stringday:dayNames){System.out.println(day);}}}7.3集合7.3.5Map接口及其类层次Map接口以该接口为根的集合类用于存储“关键字”(key)和“值”(value)的元素对,其中每个关键字映射到一个值当需要通过关键字实现对值的快速存取时使用声明的抽象方法主要有查询方法修改方法两个主要实现类HashTable(1.0)HashMap(1.2)497.3集合7.3.5Map接口及其类层次(续)查询方法intsize()——返回Map中的元素个数booleanisEmpty()——返回Map中是否包含元素,如不包括任何元素,则返回truebooleancontainsKey(Objectkey)——判断给定的参数是否是Map中的一个关键字(key)
booleancontainsValue(Objectval)——判断给定的参数是否是Map中的一个值(value)
Objectget(Objectkey)——返回Map中与给定关键字相关联的值(value)Collectionvalues()——返回包含Map中所有值(value)的Collection对象SetkeySet()——返回包含Map中所有关键字(key)的Set对象SetentrySet()——返回包含Map中所有项的Set对象507.3集合7.3.5Map接口及其类层次(续)修改方法Objectput(Objectkey,Objectval)——将给定的关键字(key)/值(value)对加入到Map对象中。其中关键字(key)必须唯一,否则,新加入的值会取代Map对象中已有的值voidputAll(Mapm)——将给定的参数Map中的所有项加入到接收者Map对象中Objectremove(Objectkey)——将关键字为给定参数的项从Map对象中删除voidclear()——从Map对象中删除所有的项517.3集合7.3.6哈希表(HashTable,HashMap)也称为散列表,是用来存储群体对象的集合类结构,其两个常用的类是HashTable及HashMap哈希表存储对象的方式与前面所讲的数组,Vector及ArrayList不同数组,Vector及ArrayList中对象的存储位置是随机的,即对象本身与其存储位置之间没有必然的联系。因此查找一个对象时,只能以某种顺序(如顺序查找,二分查找)与各个元素进行比较,如果数组或向量中的元素数量很庞大时,查找的效率必然降低哈希表中,对象的存储位置和对象的关键属性k之间有一个特定的对应关系f,我们称之为哈希(Hash)函数。它使每个对象与一个唯一的存储位置相对应。因而在查找时,只要根据待查对象的关键属性k,计算f(k)的值即可知其存储位置527.3集合7.3.6哈希表(HashTable,HashMap)(续)
——哈希表相关的主要概念哈希表相关的一些主要概念容量(capacity)——哈希表的容量不是固定的,随对象的加入,其容量可以自动扩充关键字/键(key)——每个存储的对象都需要有一个关键字key,key可以是对象本身,也可以是对象的一部分(如对象的某一个属性)哈希码(hashcode)——要将对象存储到HashTable,就需要将其关键字key映射到一个整型数据,称为key的哈希码(hashcode)哈希函数(hashfunction)——返回对象的哈希码项(item)——哈希表中的每一项都有两个域:关键字域key及值域value(即存储的对象)。key及value都可以是任意的Object类型的对象,但不能为空(null),HashTable中的所有关键字都是唯一的装填因子(loadfactor)——(表中填入的项数)/(表的容量)537.3集合7.3.6哈希表(HashTable,HashMap)(续)
——HashTable的常用方法1构造方法Hashtable();
//初始容量为101,最大装填因子为0.7
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 短视频平台内容监管与网络生态治理创新研究与实践报告
- 数字孪生视角下2025年城市规划与建设中的智慧城市能源管理系统优化与评估优化优化报告
- 2025年智慧交通系统交通流量预测技术智能交通数据挖掘与智能控制报告
- 工业互联网平台微服务架构性能测试报告2025:边缘计算与实时性能优化
- 电竞商业赞助策略报告:2025年品牌合作案例分析
- 功能性饮料在健身器材销售中的市场推广策略报告
- 培训班门店财务管理制度
- 亚马逊销售组长管理制度
- 早餐健康宿舍管理制度
- 房产公司运营部管理制度
- 福建省福州市2023−2024学年高一下册期末考数学试卷附解析
- 2025年宜宾市英语七下期末复习检测试题含答案
- 项目管理从立项到结项全解析
- 全国导游人员资格考试单科综合测试卷(科目一:政策与法律法规)
- 2024年中国铁路成都局集团有限公司招聘考试《铁路基本常识》真题库及答案
- 中医诊断学考点总结
- 生态草场使用权转让协议
- 第18课清朝的边疆治理教学设计-统编版七年级历史下册
- 物流实操试题及答案详解
- 播出设备检修管理制度
- 国家开放大学学习网电大证券投资分析形考任务12345答案
评论
0/150
提交评论