JAVA语言与编程第7章容器和泛型_第1页
JAVA语言与编程第7章容器和泛型_第2页
JAVA语言与编程第7章容器和泛型_第3页
JAVA语言与编程第7章容器和泛型_第4页
JAVA语言与编程第7章容器和泛型_第5页
已阅读5页,还剩27页未读, 继续免费阅读

下载本文档

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

文档简介

1、第7章集装箱和泛型,7.8泛型方法,7.7泛型,7.12泛型数组,7.1单元和interraton,7.2实用程序类collect,7.3集(集),7.4列表(列表)7.10通配符和有限通配符,7.11子基本类型包括List、Set、Queue和Map,这些对象类型也称为集合类。容器提供了存储对象的完善方法。java集装箱类库在java.util包中,Java集装箱类库的接口和类之间的关系在图7.1中显示,实线表示继承,虚线表示介面实现。引入泛型的最大原因是安全地使用集装箱类。图7.1集装箱类、7.1 Collection和Iterator,Collection是集装箱类的根接口,而List、

2、Set和Queue是直接子接口。Collection表示一组对象,也称为Collection的元素。列表类型容器使您可以包含重复对象,按索引位置排序,以及在容器中按索引位置搜索对象。不能在Set类型容器中添加重复对象,也不能以任何方式对齐对象。贴图界面不继承集合界面。映射类型容器中的每个元素都包含一对关键对象和值对象,容器中的关键对象不能重复,值对象可以重复。表7.1列出了Collection接口中常用的方法。表7.1 Collection中的常规方法、7.1 Collection和Iterator、Collection接口中的Iterator()和toArray()方法用于获取容器的所有元素

3、,在Iterator接口中声明了以下方法:boolean hasNext():检查容器中的元素是否遍历,否则返回true。Next():返回迭代的下一个元素。Void remove():从迭代器指向的集合中删除迭代器返回的最后一个元素。要调用Remove()一次,必须调用next()方法一次。也就是说,不能连续多次调用remove()。示例7.1向容器中添加一组元素,并使用iterator()方法遍历容器中的元素。与、7.2实用程序类Collections、java.util.Arrays类似,java.util.Collections类具有有用的static方法。其中一些方法用于操作List

4、类型容器,有些方法表示可变长度线性表,Collections的以下方法适用于List类型:Copy(List dest,List src):将一个列表中的所有元素复制到另一个列表中。Fill(List list,T obj):使用指定的元素替换指定列表中的所有元素。NCopies(int n,T o):返回包含指定对象的n个副本的不可修改列表。Shuffle(列表列表):将指定列表重新定位为默认随机源。Sort(列表列表):按自然顺序以升序对指定列表排序。示例使用7.2 Collections的nCopies()、min()、max()和binarySearch()等常用方法。7.3 Set(

5、集),7.3.1 HashSet HashSet类通过散列算法访问容器中的对象,从而提高了访问和祖怀性能。向容器添加对象时,HashSet调用对象的hashCode()方法获取散列代码,然后根据牙齿散列代码进一步计算对象在容器中的存储位置。在Object类中定义hashCode()和equals()方法时,Object类的equals()方法会按对象的内存地址比较对象是否相同,因此,如果object1.equals(object2)为true,则两个对象equals可以使HashSet牙齿正常工作例如,如果object1.equals(object2)为true,则以下表达式的结果也必须为tr

6、ue:object 1 . hash code()=object 2 . hash code();如果自定义类复盖Object类equals()方法,但不复盖Objec类hashCode()方法,则object1.equals(object2)为true时,会发生object1和object2的散列示例7.3,7.3.2 TreeSet,TreeSet类实现了用于对齐容器中对象的SortedSet接口。将对象添加到TreeSet后,Set Set=new TreeSet();Set.add(新字符串(spring);Set.add(新字符串(summer);Set.add(新字符串(autum

7、n);Set.add(新建字符串(winter);system . out . print ln(set);运行结果:autumn、spring、summer和wintertreeset支持两种茄子排序方法:默认排序和排序规范。默认情况下,TreeSet使用默认排序方法。1.自然地,JDK类库中的一些类实现了java.lang.Comparable介面(例如Integer、Double、String等)。Comparable接口具有compareTo(Object o)方法,该方法返回整数类型。帕累托(y):如果返回值为0,则x和y相等。如果返回值大于0,则x大于y。返回值小于0表示x小于y。

8、7.3.2 TreeSet、TreeSet调用对象的compareTo()方法以比较容器中对象的大小,然后按升序排序。表7.2列出了在JDK类库中实现Comparable接口的一些类的排序和排序方法。使用表7.2类排序、自然排序时,只能向TreeSet容器添加以下类型的对象:set set=new TreeSet();set . add(new Integer(1);Set.add(新字符串(spring);system . out . print ln(set);/java.lang.ClassCastException异常必须添加到TreeSet容器中,以便该对象的类实现Comparabl

9、e接口。示例7.4向TreeSet容器中添加4条职员信息,并根据薪金量按升序排序。7.3.2 TreeSet,2 .指定Java.util.Comparator介面排序提供了具体的排序方法,指定要比较的对象类型,如果Comparator界面的compare(T o1,T O2) Compare(T o1,T O2)的返回值大于0,则大于o1牙齿O2。如果Compare(T o1,T O2)的返回值为0,则o1等于O2。Compare(T o1,T O2)的返回值小于0表示小于o1牙齿O2。示例7.5通过实现Comparator接口添加到TreeSet容器中的对象按brand降序、place升序

10、排序。7.4 List(列表),7.4.1 ArrayList ArrayList表示可变长度数组,可以随机快速访问元素,但在ArrayList中插入和删除元素的速度较慢。ArrayList不安全线程。为了使线程安全,请使用list list=collections . synchronized list(new ArrayList();示例7.6使用ArrayList类的各种方法,并显示类似方法的异同。说明:牙齿程序使用ArrayList的多种茄子方法。将创建ArrayList类型的容器,并通过add方法添加四个茄子String类型的对象。容器包含horse对象,contains()方法返回

11、true。使用Remove()方法删除使用get()方法获取的pig对象。您可以使用SubList()方法,取得fromIndex(包含)和toIndex(排除)之间的部分检视。Collections.sort(sub)语句按字母顺序对容器中的对象进行排序。Collections.shuffle(sub,rand)语句使用指定的随机源重新定位指定的列表。RetainAll()方法是有效的交集操作。如果是牙齿,请保留copy和sub中的所有元素。将指定集合的所有元素插入列表中的指定位置。执行List.toArray()陈述式会传回包含容器所有元素的阵列。List.toArray(new Stri

12、ng0语句返回包含容器所有元素的数组。返回数组的运行时类型与参数数组(而不是简单的Object)完全相同。7.4.2 LinkedList,LinkedList在内部使用双向循环链接列表实现,插入和删除元素的速度快,随机访问的速度慢。LinkedList具有单独的方法addFirst()、addLast()、getFirst()、getLast()、removeFirst()和removeLast()同样,LinkedList也是线程不安全的。示例7.7测试LinkedList类的某些方法的异同。7.4.3堆栈实现,“堆栈”通常是后进先出的集装箱,高级后弹出。LinkedList具有直接实现堆

13、栈功能的方法,因此可以将LinkedList直接用作堆栈。示例7.8使用LinkedList实现堆栈功能。7.5队列,队列是典型的先进先出容器。换句话说,在容器的一端放置对象,从另一端弹出对象,将对象放入容器的顺序与签出对象的顺序相同。队列经常用作将对象从程序的一个区域可靠地传输到另一个区域的方法。LinkedList提供了支持队列行为的方法,并实现了Queue接口,因此可以将LinkedList用作Queue实现。将LinkedList向上转换为Queue。示例7.9使用LinkedList实现队列。7.5.1 PriorityQueue,Queue实现类为PriorityQueue。在Pr

14、iorityQueue中调用offer()方法插入对象时,对象将在队列中排序。默认排序使用队列中对象的自然顺序,但您可以通过提供Comparator来修改顺序。PriorityQueue使调用peek()、poll()和remove()方法时获取的元素成为队列中优先级最高的元素。优先级队列不允许null元素,其他优先级队列不是线程安全性。为了线程安全,可以使用Java . util . concurrent . priority blockingqueue。示例7.10使用PriorityQueue导入优先级最高的元素。7.5.2实现队列,在前面讨论List时,可以使用LinkedList实现

15、堆栈功能,使用LinkedList实现队列功能。示例:向尾部添加元素,从第一部分删除元素,反之亦然。示例7.11使用LinkedList实现队列功能。7.5.3双向队列、双向队列(或双向队列)相当于可以在一端添加或删除元素的队列,LinkedList包含支持双向队列的方法。示例7.12在双向队列的两端分别添加元素,并在队列的两端删除元素。7.6映射(映射)和映射(映射)是映射关键对象和值对象的集合,其中每个元素都包含关键对象和值对象对,值对象仍然可以是映射类型。这样就形成了多阶段映射。向映射容器添加元素时,必须提供键对象和值对象对。从映射容器检索元素时,只要给定了关键对象,就会返回相应的值对象

16、。贴图中每个键最多只能映射一个值。使用示例7.13映射put()方法向容器中添加元素,使用get()方法检索与关键对象对应的值对象。7.6.1 HashMap,HashMap的实例有两个影响性能的茄子参数:初始容量和负载系数。容量是哈希表的桶数,初始容量只是创建哈希表时的容量。负载系数是哈希表在容量自动增加之前可以达到的大小。如果哈希表中的条目数超过负载因子与当前容量的乘积,则对哈希表执行rehash操作(即重新配置内部数据结构)牙齿,从而使哈希表中的桶数大约翻倍。一般而言,预设负载系数(. 75)会在时间和空间成本中寻找折衷。负载系数过高会减少空间开销,但也会增加查询成本。设定初始容量时,请考虑对应所需的项目数目和负载系数,以将rehash作业数目降至最低。如果初始容量大于最大条目数除以负载系数,则不会发生rehash操作。将许多映射关系存储在HashMap实例中时,如果根据需要执行自动rehash操

温馨提示

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

评论

0/150

提交评论