Java面向对象程序设计第13章_泛型与集合框架_第1页
Java面向对象程序设计第13章_泛型与集合框架_第2页
Java面向对象程序设计第13章_泛型与集合框架_第3页
Java面向对象程序设计第13章_泛型与集合框架_第4页
Java面向对象程序设计第13章_泛型与集合框架_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

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

文档简介

1、1本章主要内容n13.1 java集合框架概念n13.2 java.util.Collection接口n13.3 List接口n13.4 Set接口 n13.5 Map接口n13.6 泛型13.1 JAVA集合框架 集合框架?指存储一系列的变量Java集合框架?常见数据结构的类数组VS集合1 数组大小固定: int a=new int5;集合框架大小不固定2 数组是一种一维结构字典: 中文,英文(狗 Dog 猫 Cat)不同的集合框架功能: 存储快,查询快,实现更为复杂的功能。学学员员1学学员员20如何存储每天的新闻信息?如何存储每天的新闻信息?如果并不知道程序运行时会需要多少对象,如果并不知

2、道程序运行时会需要多少对象,可以可以使用使用Java集合框架集合框架一维数组一维数组新闻新闻1新闻新闻N每天的新闻总数每天的新闻总数不确定,太少浪不确定,太少浪费空间,太多空费空间,太多空间不足间不足存储一个班学员信息,假定一个班容纳存储一个班学员信息,假定一个班容纳20名学员名学员数组与集合框架的比较如何存储软件工程专业课程的代码与课程信息,如何存储软件工程专业课程的代码与课程信息,能够通过代码方便地获得课程信息?能够通过代码方便地获得课程信息?需要更复杂方式存储对象需要更复杂方式存储对象可以使用可以使用Java集合框架集合框架代码代码1代码代码N课程课程1课程课程N一一对应一一对应集合框架

3、实现更为复杂方式存储对象集合框架内容n三大内容:n接口:即表示集合的抽象数据类型。接口提供了让我们对集合中所表示的内容进行单独操作的可能。n实现:也就是集合框架中接口的具体实现。实际它们就是那些可复用的数据结构。n算法:在一个实现了某个集合框架中的接口的对象身上完成某种有用的计算的方法,例如查找、排序等。这些算法通常是多态的,因为相同的方法可以在同一个接口被多个类实现时有不同的表现。事实上,算法是可复用的函数。如果你学过C+,那C+中的标准模版库(STL)你应该不陌生,它是众所周知的集合框架的绝好例子。5集合框架对编程有什么好处呢集合框架对编程有什么好处呢6提高程序设计效率。提高程序速度和质量

4、。集合框架通过提供对有用的数据结构和算法的高性能和高质量的实现使你的程序速度和质量得到提高。集合框架鼓励软件的复用。对于遵照标准集合框架接口的新的数据结构是可复用的。Java集合框架包含的内容详解1接口接口CollectionListMap2具体类具体类ArrayListLinkedListHashMap3算法算法Java集合框架为我们提供了一套性能优良、使用方便的集合框架为我们提供了一套性能优良、使用方便的接口和类,它们位于接口和类,它们位于java.util包中包中我们需学会如何使用它们,就可处理实际应用中问题我们需学会如何使用它们,就可处理实际应用中问题 Collections提供了对集

5、合进行排序、提供了对集合进行排序、遍历等多种算法实现遍历等多种算法实现SetTreeSetHashSetTreeMapn用用“集合框架集合框架”设计软件时,记住该框架四个基本设计软件时,记住该框架四个基本接口的层次结构关系会有用处:接口的层次结构关系会有用处:nCollection 接口是一组允许重复的对象。接口是一组允许重复的对象。 nSet 接口继承接口继承 Collection,但不允许重复。,但不允许重复。 nList 接口继承接口继承 Collection,允许重复,并引入位置,允许重复,并引入位置下标。下标。 nMap 接口既不继承接口既不继承 Set 也不继承也不继承 Colle

6、ction。 813.2 java.util.Collection接口nCollection(容器)接口是Collection层次结构中的根接口nCollection表示一组对象,这些对象也称为collection 的元素(Elements)nJDK 不提供此接口的任何直接实现n由Collection接口派生的两个接口是List和Set,JDK提供的容器类都是这些子接口的类实现n不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,可逐一访问Collection中每一个元素 13.2 java.util.Collection接口 13.3 Lis

7、t接口nArrayList实现了长度可变的数组,在内存中分配连续的空间。遍历元素和随机访问元素的效率比较高nLinkedList采用链表存储方式。插入、删除元素时效率比较高ListArrayListLinkedList13.3.1 ArrayList集合类n存储多条小狗信息,获取狗狗总数,逐条打印出各条狗狗信息 n通过List接口的实现类ArrayList实现该需求n元素个数不确定n要求获得元素的实际个数n按照存储顺序获取并打印元素信息ArrayList集合类public class Test1 public static void main(String args) Dog ououDog

8、= new Dog(欧欧欧欧, 雪娜瑞雪娜瑞);Dog yayaDog = new Dog(亚亚亚亚, 拉布拉多拉布拉多);Dog meimeiDog = new Dog(美美美美, 雪娜瑞雪娜瑞);Dog feifeiDog = new Dog(菲菲菲菲, 拉布拉多拉布拉多);List dogs = new ArrayList();dogs.add(ououDog);dogs.add(yayaDog);dogs.add(meimeiDog);dogs.add(2, feifeiDog); / 添加添加feifeiDog到指定位置到指定位置System.out.println(共计有共计有 +

9、 dogs.size() + 条狗狗。条狗狗。);System.out.println(分别是:分别是:);for (int i = 0; i dogs.size(); i+) Dog dog = (Dog) dogs.get(i);System.out.println(dog.getName() + t+ dog.getType ();创建创建ArrayList对象并对象并把四个狗狗对象放入把四个狗狗对象放入其中其中输出狗狗的数量输出狗狗的数量获取第获取第i i个元素个元素 如何遍历List集合n如何遍历List集合呢?n方法1:通过for循环和get()方法配合实现遍历n方法2:通过迭代器

10、Iterator实现遍历 n所有集合接口和类都没有提供相应遍历方法,而是由Iterator实现集合遍历nCollection 接口的iterate()方法返回一个Iterator,然后通过Iterator接口的两个方法可实现遍历nboolean hasNext(): 判断是否存在另一个可访问的元素 nObject next(): 返回要访问的下一个元素迭代器Iteratorpublic class Test5 public static void main(String args) / 1、创建多个狗狗对象、创建多个狗狗对象Dog ououDog = new Dog(欧欧欧欧, 雪娜瑞雪娜瑞)

11、; / 2、创建、创建ArrayList集合对象并把多个狗狗对集合对象并把多个狗狗对象放入其中象放入其中List dogs = new ArrayList ();dogs.add(ououDog);System.out.println(使用使用Iterator遍历,所有遍历,所有狗狗昵称和品种是狗狗昵称和品种是:);Iterator it = dogs.iterator();while (it.hasNext() Dog dog = (Dog) it.next();System.out.println(dog.getName()+t+dog.getType();通过迭代器依次输出通过迭代器依次

12、输出所有狗狗的信息所有狗狗的信息ArrayList集合类n扩充以下几部分功能n删除指定位置的狗狗,如第一个狗狗n删除指定的狗狗,如删除feifeiDog对象n判断集合中是否包含指定狗狗nList接口提供相应方法remove()、contains(),直接使用即可 ArrayList集合类public class Test2 public static void main(String args) / 1、创建多个狗狗对象、创建多个狗狗对象/ 2、创建、创建ArrayList集合对象并把多个狗狗对象放入集合对象并把多个狗狗对象放入其中其中System.out.println(删除之前共计有删除之

13、前共计有 +dogs.size() + 条狗狗。条狗狗。);dogs.remove(0);dogs.remove(feifeiDog);System.out.println(n删除之后还有删除之后还有 + dogs.size() + 条狗狗。条狗狗。); if(dogs.contains(meimeiDog)System.out.println(n集合中包含美美的信息集合中包含美美的信息);elseSystem.out.println(n集合中不包含美美的信息集合中不包含美美的信息);删除第一个狗狗和删除第一个狗狗和feifeiDog判断是否包含指定判断是否包含指定狗狗狗狗ArrayList集

14、合类nList接口常用方法 方法名说 明boolean add(Object o)在列表的末尾顺序添加元素,起始索引位在列表的末尾顺序添加元素,起始索引位置从置从0 0开始开始void add(int index,Object o)在指定的索引位置添加元素。索引位置必在指定的索引位置添加元素。索引位置必须介于须介于0 0和列表中元素个数之间和列表中元素个数之间int size()返回列表中的元素个数返回列表中的元素个数Object get(int index)返回指定索引位置处的元素。取出的元素返回指定索引位置处的元素。取出的元素是是ObjectObject类型,使用前需要进行强制类型类型,使

15、用前需要进行强制类型转换转换boolean contains(Object o)判断列表中是否存在指定元素判断列表中是否存在指定元素boolean remove(Object o)从列表中删除元素从列表中删除元素Objectremove(int index)从列表中删除指定位置元素,起始索引位从列表中删除指定位置元素,起始索引位置从置从0 0开始开始13.3.2 LinkedListn在集合任何位置(头部、中间、尾部)添加、获取、删除狗狗对象n插入、删除操作频繁时,可使用LinkedList来提高效率nLinkedList还额外提供对头部和尾部元素进行添加和删除操作的方法 LinkedList

16、集合类public class Test3 public static void main(String args) / 创建多个狗狗对象创建多个狗狗对象LinkedList dogs = new LinkedList();dogs.add(ououDog);dogs.add(yayaDog);dogs.addLast(meimeiDog);dogs.addFirst(feifeiDog);Dog dogFirst= (Dog)dogs.getFirst();System.out.println(第一条狗狗昵称是第一条狗狗昵称是+dogFirst.getName() );Dog dogLast

17、= (Dog)dogs.getLast();System.out.println(最后一条狗狗昵称是最后一条狗狗昵称是+dogLast.getName();dogs.removeFirst();dogs.removeLast();创建创建LinkedList集集合对象并把多个狗合对象并把多个狗狗对象放入其中狗对象放入其中获取第一条狗狗信息获取第一条狗狗信息获取最后一条狗狗获取最后一条狗狗信息信息删除第一个狗狗和删除第一个狗狗和最后一个狗狗最后一个狗狗LinkedList集合类nLinkedList的特殊方法方法名说 明voidaddFirst(Object o)在列表的首部添加元素在列表的首部

18、添加元素voidaddLast(Object o)在列表的末尾添加元素在列表的末尾添加元素ObjectgetFirst()返回列表中的第一个元素返回列表中的第一个元素ObjectgetLast()返回列表中的最后一个元素返回列表中的最后一个元素ObjectremoveFirst()删除并返回列表中的第一个元素删除并返回列表中的第一个元素ObjectremoveLast()删除并返回列表中的最后一个元素删除并返回列表中的最后一个元素小结n集合框架有何好处? nJava集合框架中包含哪些接口和哪些类?nArrayList和LinkedList有何异同?nList总结:ArrayList本质是数组,

19、适合在末尾添加数据,适合随机访问。LinkedList本质类似链表,适合随时随处修改、增加、删除元素,并且具有顺序性,即是适合存放经常做插入、删除操作、有顺序要求的一组数据。13.4 Set接口nList用于存储nSet用于快速查找13.4 HashSet类类 HashSet是使用一个哈希表存储元素的,是非排序的,不允许有重复元素,可以随机访问,是Set接口的最优性能实现。为了保证HashSet能正常工作,要求当两个对象用equals()方法比较的结果为true时,它们的哈希码也相等。例如,如果object1.equals(object2)为true,那么以下表达式的结果也应为true。obj

20、ect1.hashCode() = object2.hashCode();13.4.1 HashSetimport java.util.*;public class TestHash public static void main(String args) Set list = new HashSet();list.add(tom);list.add(Alice);list.add(Jerry);list.add(1);list.add(2);list.add(3);list.add(1);list.add(2);list.add(3);for (String s : list) System

21、.out.println(s);13.4.2 TreeSetTreeSet类实现了SortedSet接口,能够对容器中的对象进行排序。当向TreeSet中加入一个对象后,会继续保持对象间的排序的次序。例如下面的代码片段:Set set = new TreeSet();set.add(new String(spring);set.add(new String(summer);set.add(new String(autumn);set.add(new String(winter);System.out.println(set);运行结果:autumn, spring, summer, winte

22、r13.4.2 TreeSet为什么可以实现排序?在JDK类库中,有一部分类实现了java.lang.Comparable接口,如Integer、 Double 和String等。Comparable接口有一个compareTo(Object o)方法,它返回整数类型。pareTo(y):如果返回值为0,则表示x和y相等;如果返回值大于0,则表示x大于y;如果返回值小于0,则表示x小于y。TreeSet调用对象的compareTo()方法比较容器中对象的大小,然后进行升序排列。13.4.2 TreeSet使用自然排序时,只能向TreeSet容器中加入同类型的对象,如下所示。Set set =

23、new TreeSet();set.add(new Integer(1);set.add(new String(spring);System.out.println(set);/抛出java.lang.ClassCastException异常向TreeSet容器中加入同类型的对象,要求这些对象的类必须实现Comparable接口。【例】 向TreeSet容器中加入4个学生,并按英语成绩的多少进行升序排列。13.4.2 TreeSet 13.5 Map接口n建立国家英文简称和中文全名间的键值映射,并通过key对value进行操作,应该如何实现数据的存储和操作呢? nMap接口专门处理键值映射数据

24、的存储,可以根据键实现对值的操作n最常用的实现类是HashMap Map接口3-2 public class Test4 public static void main(String args) Map countries = new HashMap();countries.put(CN, 中华人民共和国中华人民共和国);countries.put(RU, 俄罗斯联邦俄罗斯联邦);countries.put(FR, 法兰西共和国法兰西共和国);countries.put(US, 美利坚合众国美利坚合众国);String country = (String) countries.get(CN);

25、System.out.println(CN对应的国家是:对应的国家是: + country);System.out.println(Map中共有中共有+countries.size()+组数据组数据);countries.remove(FR);System.out.println(Map中包含中包含FR的的key吗?吗? + countries.containsKey(FR);System.out.println( countries.keySet() ) ;System.out.println( countries.values() );System.out.println( countri

26、es ); 使用使用HashMap存存储多组键值对储多组键值对获取获取Map元素个数元素个数删除指定元素,判断删除指定元素,判断是否包含指定元素是否包含指定元素显示键集、值集和键值对集显示键集、值集和键值对集获取指定元素的值获取指定元素的值Map接口3-3nMap接口常用方法方法名说 明Object put(Object key, Object val)以以“键键- -值对值对”的方式进行存储的方式进行存储Object get (Object key)根据键返回相关联的值,如果不根据键返回相关联的值,如果不存在指定的键,返回存在指定的键,返回nullnullObject remove (Obj

27、ect key)删除由指定的键映射的删除由指定的键映射的“键键- -值对值对”int size()返回元素个数返回元素个数Set keySet ()返回键的集合返回键的集合Collection values ()返回值的集合返回值的集合booleancontainsKey (Object key)如果存在由指定的键映射的如果存在由指定的键映射的“键键- -值对值对”,返回,返回truetrue集合类对比nVector和ArrayList的异同n实现原理相同,功能相同,很多情况下可以互用n两者的主要区别如下nVector线程安全,ArrayList重速度轻安全,线程非安全n长度需增长时,Vect

28、or默认增长一倍,ArrayList增长50%集合类对比nHashtable和HashMap的异同n实现原理相同,功能相同,在很多情况下可以互用n两者的主要区别如下nHashtable继承Dictionary类,HashMap实现Map接口nHashtable线程安全,HashMap线程非安全nHashtable不允许null值,HashMap允许null值开发过程中,最好使用开发过程中,最好使用ArrayList和和HashMap13.6 泛型n把任何类型对象通过add(Object obj) 放入List中,认为只是Object类型n通过get(int index) 取出List中元素时必

29、须进行强制类型转换,繁琐而且容易出现异常n使用Map的put(Object key, Object value)和get (Object key)存取对象时存在同样问题n使用Iterator的next()方法获取元素时存在同样问题nJDK5.0中通过引入泛型有效的解决了这个问题中通过引入泛型有效的解决了这个问题nJDK5.0使用泛型改写了集合框架中的所有接口和类使用泛型改写了集合框架中的所有接口和类泛型集合3-2public class Test6 public static void main(String args) / 1、创建多个狗狗对象、创建多个狗狗对象Dog dog1 = new

30、Dog(欧欧欧欧, 雪娜瑞雪娜瑞);/ 2、创建、创建ArrayList集合对象并把多个狗狗对象集合对象并把多个狗狗对象List dogs = new ArrayList();dogs.add(dog1);/dogs.add(hello); / 3、 显示第三个元素的信息显示第三个元素的信息Dog dog = dogs.get(2); System.out.println(第三个狗狗的信息如下:第三个狗狗的信息如下:);System.out.println(dog.getName() + t + dog.getStrain();/4、使用、使用Iterator遍历遍历dogs对象对象System.out.println(n所有狗狗的信息如下:所有狗狗的信息如下:);Iterator it = dogs.iterator();while (it.hasNext() dog = it.next();Syste

温馨提示

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

评论

0/150

提交评论