泛型与集合框架_第1页
泛型与集合框架_第2页
泛型与集合框架_第3页
泛型与集合框架_第4页
泛型与集合框架_第5页
已阅读5页,还剩111页未读 继续免费阅读

下载本文档

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

文档简介

1、网 络 程 序 设 计,JAVA网络程序设计 SsandyYao,泛型与集合框架,P136 例7-7 P137 例7-8 P140 例7-10 P141 例7-11 P143 例7-12,P145 例7-13 P146 例7-14 P148 例7-15 P149 作业题3-4,泛型与集合框架,1 LinkedList泛型类 2 HashSet泛型类 3 HashMap泛型类 4 TreeSet泛型类 5 TreeMap泛型类 6 Stack泛型类,泛型与集合框架,什么是集合框架,集合框架:是为表示和操作集合而规定的一种统一标准的体系结构。 集合中只能容纳对象。 对象会自动扩展,以容纳添加到其中

2、的所有对象。 Java 2的集合类型被统一组织在Java集合框架(Java Collections Framework)当中。,.,什么是集合框架,Java的集合框架提供了一套设计优良的接口和类,使程序员操作成批的数据或对象元素极为方便,极大的减化了程序员编程时的负担。 Java的集合框架的核心接口为:Collection、Map、Iterator,这三个接口是以后要使用的最重要,最多的接口。 Java 2的集合类型被统一组织在Java集合框架(Java Collections Framework)当中。,.,什么是集合框架,.,什么是集合框架,按具体集合类使用上的特性来分的话,主要有三类:L

3、ist、Set和Map。 List是有序的,但允许重复。 Set是无序的,但不允许重复。 Map主要表现的是键值对的概念。,.,集合与数组的区别,数组是定长,即创建后固定不变;集合是不定长的,其长度可以动态增长或减少。 数组是同构的,即数组中的元素是相同的类型;集合可以是异构的,当然也可以通过泛型创建类型安全的同构集合。 数组中可以存放基本数据类型或对象;集合只存放对象。,.,Collection接口,Collection接口是在整个Java集合中List和Set的父接口,此接口定义如下: public interface Collection extends Iterable 此接口使用了泛

4、型。,.,Collection接口,常用方法: add(E e)/remove(Object o) 添加或移除元素。 clear() 清空集合中的所有元素。 contains(Object o) 如果此集合包含指定的元素,则返回true。 iterator() 返回在此集合内的元素的迭代器。 size() 获取集合 中的元素个数。 toArray()/toArray(T a) 返回包含些集合中的所有元素的数组。,.,List接口,List是Collection的子接口,里面的所有内容都是允许重复。 它在Collection接口的基础上做了不少的扩展。比较典型的方法有:add(),get(),r

5、emove(),listIterator()。,.,什么是迭代器模式,迭代器模式:提供一种方法,它能够用来遍历(访问)集合的部分或全部元素,而又不暴露其内部的表示。 Java的集合框架已经实现好了迭代器模式,只需要使用即可。,什么是链表?,以链式结构存储的线性表称之为线性链表。 特点是该线性表中的数据元素可以用任意的存储单元来存储。线性表中逻辑相邻的两元素的存储空间可以是不连续的。为表示逻辑上的顺序关系,对表的每个数据元素除存储本身的信息之外,还需存储一个指示其直接衔接的信息。这两部分信息组成数据元素的存储映象,称为结点。,7.4 LinkedList泛型类,使用LinkedList泛型类可以

6、创建链表结构的数据对象。链表是由若干个节点组成的一个种数据结构,每个节点含有一个数据和下一个节点的引用(单链表),或含有一个数据以及上一个节点的引用和下一个节点的引用(双链表),节点的索引从0开始。链表适合动态改变它存储的数据,如增加、删除节点等。,7.4 LinkedList泛型类,1、LinkedList对象 java.util包中的LinkedList泛型类创建的对象以链表结构存储数据,习惯上称LinkedList类创建的对象为链表对象。例如, LinkedList mylist=new LinkedList();,7.4 LinkedList泛型类,创建一个空双链表。然后mylist可

7、以使用add(String obj)方法向链表依次增加节点,节点中的数据是参数obj指定对象的引用,如: mylist.add(“How”); mylist.add(“Are”); mylist.add(“You”);,7.4 LinkedList泛型类,mylist.add(“Java”); 这时,双链表mylist就有了4个节点,节点是自动连接在一起的,不需要我们再去做连接。也就是说,不需要我们去操作安排节点中所存放的下一个或上一个节点的引用。,7.4 LinkedList泛型类,2、常用方法 以下是LinkedList泛型类的一些常用方法: public boolean add(E el

8、ement)向链表的末尾添加一个新的节点,该节点中的数据是参数element指定的对象。,7.4 LinkedList泛型类,public void add(int index,E element)向链表的指定位置添加一个新的节点,该节点中的数据是参数element指定的对象。 public void addFirst(E element)向链表的头添加一个新的节点,该节点中的数据是参数element指定的对象。,7.4 LinkedList泛型类,public void addLast(E element)向链表的末尾添加一个新的节点,该节点中的数据是参数element指定的对象。 publ

9、ic void clear()删除链表中的所有节点,使当前链表成为空链表。,7.4 LinkedList泛型类,public E remove(int index)删除链表中指定位置上的节点。 public boolean remove(E element)删除首次出现含有数据element的节点。 public E removeFirst()删除链表中第一个节点,并返回这个节点中的对象。,7.4 LinkedList泛型类,public E removeLast()删除链表中最后一个节点,并返回这个节点中的对象。 public E get(int index)得到链表中指定位置处节点中的对象

10、。 public E getFirst()得到链表中第一个节点的对象。,7.4 LinkedList泛型类,public E getLast()得到链表中最后一个节点的对象。 public int indexOf(E element)返回含有数据element的节点在链表中首次出现的位置,如果链表中无此节点则返回-1。 public int lastindexOf(E element)返回含有数据element的节点在链表中最后出现的位置,如果链表中无此节点则返回-1。,7.4 LinkedList泛型类,public E set(int index,E element)将当前链表index位

11、置节点中的对象替换为参数element指定的对象,并返回被替换的对象。 public int size()返回链表的长度,即节点的个数。,7.4 LinkedList泛型类,public boolean contains(Object element)判断链表节点中是否有节点含有对象element。 public Object clone()得到当前链表的一个克隆链表,该克隆链表中的节点数据的改变不会影响到当前链表中节点的数据,反之亦然。,例7-7:,import java.util.*; class Student String name; int score; Student(String

12、 name,int score) =name; this.score=score; ,例7-6:,public class Example7_7 public static void main(String args) LinkedList mylist=new LinkedList(); Student stu1=new Student(张小一,78), stu2=new Student(王小二,98), stu3=new Student(李大山,67); mylist.add(stu1); mylist.add(stu2);,例7-7:,mylist.add(stu3);

13、 int number=mylist.size(); System.out.println(现在链表中有+number+个节点:); for(int i=0;inumber;i+) Student temp=mylist.get(i); System.out.printf(第+i+节点中的数据,学生:%s,分数:%dn,,temp.score); ,例7-7:,Student removeSTU=mylist.remove(1); System.out.printf(被删除的节点中的数据是:%s,%dn,removeSTU.name,removeSTU.score); Stu

14、dent replaceSTU=mylist.set(1,new Student(赵钩林,68); System.out.printf(被替换的节点中的数据是:%s,%dn,replaceSTU.name,replaceSTU.score); number=mylist.size();,例7-7:,System.out.println(现在链表中有+number+个节点:); for(int i=0;inumber;i+) Student temp=mylist.get(i); System.out.printf(第+i+节点中的数据,学生:%s,分数:%dn,,temp.s

15、core); ,例7-7:,if(mylist.contains(stu1) System.out.println(链表包含+stu1+:); System.out.println(+,+stu1.score); else System.out.println(链表没有节点含有+stu1); ,7.4 LinkedList泛型类,3、遍历链表 在例7-7中借助get()方法实现了遍历链表。我们可以借助泛型类Iterator实现遍历链表,一个链表对象可以使用iterator()方法返回一个Iterator类型的对象,该对象中每个数据成员刚好是链表节点中的数据,而且这些数据成员是

16、按顺序存放在Iterator对象中的。,7.4 LinkedList泛型类,如果链表是“Student类型”的链表,即链表节点中的数据是Student类创建的对象,那么该链表使用iterator()方法返回一个Iterator类型的对象,该对象使用next()方法遍历链表。,例7-8:遍历链表。,import java.util.*; class Student String name ; int number; float score; Student(String name,int number,float score) =name; this.number=number

17、; this.score=score; ,例7-8:遍历链表。,public class Example7_8 public static void main(String args) LinkedList mylist=new LinkedList(); Student stu_1=new Student(赵民 ,9012,80.0f), stu_2=new Student(钱青 ,9013,90.0f), stu_3=new Student(孙枚 ,9014,78.0f), stu_4=new Student(周右 ,9015,55.0f);,例7-8:遍历链表。,mylist.add(s

18、tu_1); mylist.add(stu_2); mylist.add(stu_3); mylist.add(stu_4); Iterator iter=mylist.iterator();,例7-8:遍历链表。,while(iter.hasNext() Student te=iter.next(); /使用next()方法遍历链表。 System.out.println(+ +te.number+ +te.score); ,7.4 LinkedList泛型类,4、LinkedList泛型类实现的接口 LinkedList泛型类实现了泛型接口List,而List接口是Colle

19、ction接口的子接口。LinkedList类中的绝大部分方法都是接口方法的实现。编程时,可以使用接口回调技术,即把LinkedList对象的引用赋值给Collection接口或List接口变量,那么接口就可以调用实现的接口方法。,7.4 LinkedList泛型类,5、JDK 1.5之前的LinkedList类 JDK 1.5之前没有泛型的LinkedList类,可以用普通的LinkedList创建一个链表对象,如: LinkedList mylist=new LinkedList(); 创建了一个空双链表,然后mylist链表可以使用add(Object obj)方法向这个链表依次添加节点

20、。,7.4 LinkedList泛型类,由于任何类都是Object类的子类,因此可以把任何一个对象作为链表节点中的对象。需要注意的是,使用get()获取一个节点中的对象时,要用类型转制运算符转换回原来的类型。,7.4 LinkedList泛型类,Java泛型的主要目的是可以建立具有类型安全的集合框架,如链表、散列表等数据结构,最重要的一个优点就是:在使用这些泛型类建立的数据结构时,不必进行强制类型转换,即不要求进行运行时类型检查。,7.4 LinkedList泛型类,JDK 1.5是支持泛型的编译器,它将运行时类型检查提前到编译时执行,使得代码更加安全。如果使用旧版本的LinkedList类,

21、SDK 1.5编译器会给出警告信息,但程序仍能正常运行。,例7-9:旧版本LinkedList的例子。,import java.util.*; public class Example7_9 public static void main(String args) LinkedList mylist=new LinkedList(); mylist.add(It); /链表中的第一个节点。 mylist.add(is); /链表中的第二个节点。 mylist.add(a); /链表中的第三个节点。 mylist.add(door); /链表中的第四个节点。 int number=mylist.

22、size(); /获取链表的长度。,例7-8:旧版本LinkedList的例子。,for(int i=0;inumber;i+) String temp=(String)mylist.get(i); /必须强制转换取出的数据。 System.out.println(第+i+节点中的数据:+temp); ,例7-8:旧版本LinkedList的例子。,Iterator iter=mylist.iterator(); while(iter.hasNext() String te=(String)iter.next(); /必须强制转换取出的数据。 System.out.println(te); ,

23、7.4 LinkedList泛型类,注:Java也提供了顺序结构的动态数组类ArrayList,数组采用顺序结构来存储数据。可以有效利用空间,可用于存储大量的数据。数组不适合动态改变它存储的数据,如增加、删除单元等。由于数组采用顺序结构存储数据,数组获得第n单元中的数据的速度要比链表获得第n单元中的数据快。类ArrayList的很多方法与类LinkedList类似,两者的本质区别就是:一个使用顺序结构,一个使用链表结构。,.,Set接口,Set接口是Collection的子接口,Set内的元素是唯一的。 Set接口并没有对Collection接口进行扩展,但在具体方法的含义上进行了进一步的约定

24、。,7.5 HashSet泛型类,HashSet泛型类在数据组织上类似数学上的集合,可以进行“交”、“并”、“差”等运算。 1、HashSet对象 HashSet泛型类创建的对象称为集合,例如: HashSet set=new HashSet();,7.5 HashSet泛型类,那么set就是一个可以存储String类型数据的集合,set可以调用add(String s)方法将String类型数据添加到集合中,添加到集合中的数据称做集合的元素。集合不允许有相同的元素,也就是说,如果b已经是集合中的元素,那么再执行set.add(b)操作是无效的。集合对象的初始容量是16个字节,装载因子是0.7

25、5。也就是说,如果集合添加的元素超过总容量的75时,集合的容量将增加一倍。,7.5 HashSet泛型类,2、常用方法 以下是HashSet泛型类的常用方法: public boolean add(E o)向集合添加参数指定的元素。 public void clear()清空集合,使集合不含有任何元素。,7.5 HashSet泛型类,public boolean contains(Object o)判断参数指定的数据是否属于集合。 public boolean isEmpty()判断集合是否为空。 public boolean remove(Object o)删除集合中参数指定的元素。,7.5

26、 HashSet泛型类,public int size()返回集合中的元素个数。 Object toArray()将集合元素存放到数组中,并返回这个数组。 boolean containsAll(HashSet set)判断当前集合是否包含参数指定的集合。 public Object clone()得到当前集合的一个克隆对象,该对象中元素的改变不会影响到当前集合中的元素,反之亦然。,7.5 HashSet泛型类,我们可以借助泛型类Iterator实现遍历集合,一个集合对象可以使用iterator()方法返回一个Iterator类型的对象,如果集合是“Student类型”的集合,那么该链表使用i

27、terator()方法返回一个Iterator类型的对象,该对象使用next()方法遍历集合。,例7-10:遍历集合。,import java.util.*; class Student String name; int score; Student(String name,int score) =name; this.score=score; ,例7-10:遍历集合。,public class Example7_10 public static void main(String args) Student zh=new Student(张红铭,77), wa=new Stu

28、dent(王家家,68), li=new Student(李佳佳,67); HashSet set=new HashSet(); HashSet subset=new HashSet();,例7-10:遍历集合。,set.add(zh); set.add(wa); set.add(li); subset.add(wa); subset.add(li); if(set.contains(wa) System.out.println(集合set中含有:+); ,例7-10:遍历集合。,if(set.containsAll(subset) System.out.println(集合se

29、t包含集合subset); int number=subset.size(); System.out.println(集合subset中有+number+个元素:); Object s=subset.toArray();,例7-10:遍历集合。,for(int i=0;i0时,称a大于b;pareTo(b)0时,称a小于b。,7.7 TreeSet泛型类,当mytree每次添加对象时,都会调用接口中的方法实现对象大小的互相比较,但mytree调用接口方法的过程编程人员是不可见的。Sun公司在编写开发TreeSet类时已经实现了这一机制。,例7-13:把Student对象添加到树集中,并按照成绩

30、的高低排列。,import java.util.*; class Student implements Comparable int english=0; String name; Student(int e,String n) english=e;name=n; public int compareTo(Object b) Student st=(Student)b; return (this.english-st.english); ,例7-13:把Student对象添加到树集中,并按照成绩的高低排列。,public class Example7_13 public static void

31、 main(String args) TreeSet mytree=new TreeSet(); Student st1,st2,st3; st1=new Student(90,zhan ying); st2=new Student(66,wang heng); st3=new Student(86,Liuh qing); mytree.add(st1); mytree.add(st2); mytree.add(st3);,例7-13:把Student对象添加到树集中,并按照成绩的高低排列。,Iterator te=mytree.iterator(); while(te.hasNext() S

32、tudent stu=te.next(); System.out.println( ++ +stu.english); ,7.7 TreeSet泛型类,注:树集中不允许出现大小相等的两个节点。例如,在上述例子中如果再添加语句: st4=new Student(90,”Zhang ying”); mytree.add(st4); 是无效的。如果允许成绩相同,可把上述例子中Student类中的compareTo方法更改为:,7.7 TreeSet泛型类,public int compareTo(Object b) Student st=(Student) b; if (this.e

33、nglish-st.english)=0) return 1; else return (this.english-st.english) ,7.8 TreeMap泛型类,TreeMap类实现了Map接口。TreeMap提供了按排序顺序存储关键字/值对的有效手段。应该注意的是,不像散列映射(HashMap),树映射(TreeMap)保证它的元素按照关键字升序排列。下面是TreeMap的构造函数: TreeMap() TreeMap(Comparator comp),7.8 TreeMap泛型类,第一种形式构造的树映射,按关键字的大小顺序来排序树映射中的键/值对,关键字的大小顺序是按其字符串表示

34、的字典顺序。第二种形式构造的树映射,关键字的大小顺序按Comparator接口规定的大小顺序,树映射按关键字的大小顺序来排序树映射中的关键字/值对。 TreeMap类的常用方法与HashMap类相似。,例7-14:使用TreeMap,分别按照学生的身高和体重排序对象。,import java.util.*; class MyKey implements Comparable int number=0; MyKey(int number) this.number=number; public int compareTo(Object b) MyKey st=(MyKey)b; if(this.n

35、umber-st.number)=0) return -1; else return (this.number-st.number); ,例7-14:使用TreeMap,分别按照学生的身高和体重排序对象。,class Student String name=null; int height,weight; Student(int w,int h,String name) weight=w; height=h; =name; ,例7-14:使用TreeMap,分别按照学生的身高和体重排序对象。,public class Example7_14 public static voi

36、d main(String args ) Student s1=new Student(65,177,“张三), s2=new Student(85,168,“李四); TreeMap treemap=new TreeMap(); treemap.put(new MyKey(s1.weight),s1); treemap.put(new MyKey(s2.weight),s2); int number=treemap.size();,例7-14:使用TreeMap,分别按照学生的身高和体重排序对象。,System.out.println(树映射中有+number+个对象:); Collecti

37、on collection=treemap.values(); Iterator iter=collection.iterator(); while(iter.hasNext() Student te=iter.next(); System.out.printf(%s,%d(公斤)n,,te.weight); treemap.clear();,例7-14:使用TreeMap,分别按照学生的身高和体重排序对象。,treemap.put(new MyKey(s1.height),s1); treemap.put(new MyKey(s2.height),s2); number=treemap.size(); System.out.println(树映射中有+number+个对象:); collection

温馨提示

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

评论

0/150

提交评论