泛型与集合框架

上传人:仙*** 文档编号:34807418 上传时间:2021-10-23 格式:PPT 页数:116 大小:208.01KB
收藏 版权申诉 举报 下载
泛型与集合框架_第1页
第1页 / 共116页
泛型与集合框架_第2页
第2页 / 共116页
泛型与集合框架_第3页
第3页 / 共116页
资源描述:

《泛型与集合框架》由会员分享,可在线阅读,更多相关《泛型与集合框架(116页珍藏版)》请在装配图网上搜索。

1、网 络 程 序 设 计 JAVAJAVA网络程序设计网络程序设计 SsandyYao 泛型与集合框架泛型与集合框架 P136 P136 例例7 7- -7 7 P137 P137 例例7 7- -8 8 P140 P140 例例7 7- -1010 P141 P141 例例7 7- -1111 P143 P143 例例7 7- -1212 P145 P145 例例7 7- -1313 P146 P146 例例7 7- -1414 P148 P148 例例7 7- -1515 P149 P149 作业题作业题3 3- -4 4 泛型与集合框架泛型与集合框架 1 LinkedList1 Linke

2、dList泛型类泛型类 2 HashSet2 HashSet泛型类泛型类 3 HashMap3 HashMap泛型类泛型类 4 TreeSet4 TreeSet泛型类泛型类 5 TreeMap5 TreeMap泛型类泛型类 6 Stack6 Stack泛型类泛型类 泛型与集合框架泛型与集合框架 什么是集合框架 集合框架:集合框架:是为表示和操作集是为表示和操作集合而规定的一种统一标准的体系结构。合而规定的一种统一标准的体系结构。 集合中只能容纳对象。集合中只能容纳对象。 对象会自动扩展,以容纳添加到其对象会自动扩展,以容纳添加到其中的所有对象。中的所有对象。 Java 2Java 2的集合类型

3、被统一组织在的集合类型被统一组织在JavaJava集合框架(集合框架(Java Collections Java Collections FrameworkFramework)当中。)当中。 什么是集合框架 JavaJava的集合框架提供了一套设计优良的接口的集合框架提供了一套设计优良的接口和类,使程序员操作成批的数据或对象元素和类,使程序员操作成批的数据或对象元素极为方便,极大的减化了程序员编程时的负极为方便,极大的减化了程序员编程时的负担。担。 JavaJava的集合框架的核心接口为:的集合框架的核心接口为:Collection、Map、Iterator,这三个接口是以后要使用的,这三个接

4、口是以后要使用的最重要,最多的接口。最重要,最多的接口。 Java 2Java 2的集合类型被统一组织在的集合类型被统一组织在JavaJava集合框集合框架(架(Java Collections FrameworkJava Collections Framework)当中。)当中。 什么是集合框架 Collection List Set Map SortedSet SortedMap ArrayList LinkedList HashSet TreeSet HashMap TreeMap AbstractList AbstractSet AbstractMap AbstractSequenti

5、alList AbstractCollection 什么是集合框架 按具体集合类使用上的特性来分的话,主要按具体集合类使用上的特性来分的话,主要有三类:有三类:List、Set和和Map。 List是有序的,但允许重复。是有序的,但允许重复。 Set是无序的,但不允许重复。是无序的,但不允许重复。 Map主要表现的是键值对的概念。主要表现的是键值对的概念。 集合与数组的区别 数组是定长,即创建后固定不变;集合是不数组是定长,即创建后固定不变;集合是不定长的,其长度可以动态增长或减少。定长的,其长度可以动态增长或减少。 数组是同构的,即数组中的元素是相同的类数组是同构的,即数组中的元素是相同的类

6、型;集合可以是异构的,当然也可以通过泛型;集合可以是异构的,当然也可以通过泛型创建类型安全的同构集合。型创建类型安全的同构集合。 数组中可以存放基本数据类型或对象;集合数组中可以存放基本数据类型或对象;集合只存放对象。只存放对象。 Collection接口 Collection接口是在整个接口是在整个Java集合中集合中List和和Set的父接口,此接口定义如下:的父接口,此接口定义如下: public interface Collection extends Iterable 此接口使用了泛型。此接口使用了泛型。 Collection接口 常用方法:常用方法: add(E e)/remove

7、(Object o) 添加或移除元素。添加或移除元素。 clear() 清空集合中的所有元素。清空集合中的所有元素。 contains(Object o) 如果此集合包含指定的元素,则返回如果此集合包含指定的元素,则返回true。 iterator() 返回在此集合内的元素的迭代器。返回在此集合内的元素的迭代器。 size() 获取集合获取集合 中的元素个数。中的元素个数。 toArray()/toArray(T a) 返回包含些集合中的所有元素的数组。返回包含些集合中的所有元素的数组。 List接口 List是是Collection的子接口,里面的所有内容的子接口,里面的所有内容都是允许重复

8、。都是允许重复。 它在它在Collection接口的基础上做了不少的扩接口的基础上做了不少的扩展。比较典型的方法有:展。比较典型的方法有:add(),get(),remove(),listIterator()。 什么是迭代器模式 迭代器模式:提供一种方法,它能够用来遍迭代器模式:提供一种方法,它能够用来遍历(访问)集合的部分或全部元素,而又不历(访问)集合的部分或全部元素,而又不暴露其内部的表示。暴露其内部的表示。 Java的集合框架已经实现好了迭代器模式,的集合框架已经实现好了迭代器模式,只需要使用即可。只需要使用即可。 什么是链表? 以以链式结构链式结构存储的线性表称之为线性链存储的线性表

9、称之为线性链表。表。 特点是该线性表中的数据元素可以用任特点是该线性表中的数据元素可以用任意的存储单元来存储。线性表中逻辑相邻的意的存储单元来存储。线性表中逻辑相邻的两元素的存储空间可以是不连续的。为表示两元素的存储空间可以是不连续的。为表示逻辑上的顺序关系,对表的每个数据元素除逻辑上的顺序关系,对表的每个数据元素除存储本身的信息之外,还需存储一个指示其存储本身的信息之外,还需存储一个指示其直接衔接的信息。这两部分信息组成数据元直接衔接的信息。这两部分信息组成数据元素的存储映象,称为结点。素的存储映象,称为结点。 7.4 LinkedList泛型类 使用使用LinkedListLinkedLi

10、st泛型类可以创建泛型类可以创建链表结构的数据对象。链表是由若干个链表结构的数据对象。链表是由若干个节点组成的一个种数据结构,每个节点节点组成的一个种数据结构,每个节点含有一个数据和下一个节点的引用(单含有一个数据和下一个节点的引用(单链表),或含有一个数据以及上一个节链表),或含有一个数据以及上一个节点的引用和下一个节点的引用(双链点的引用和下一个节点的引用(双链表),节点的索引从表),节点的索引从0 0开始。链表适合动开始。链表适合动态改变它存储的数据,如增加、删除节态改变它存储的数据,如增加、删除节点等。点等。 7.4 LinkedList泛型类 1 1、LinkedListLinked

11、List对象对象 java.utiljava.util包中的包中的LinkedListLinkedList泛泛型类创建的对象以链表结构存储数据,型类创建的对象以链表结构存储数据,习惯上称习惯上称LinkedListLinkedList类创建的对象为类创建的对象为链表对象。例如,链表对象。例如, LinkedList mylist=new LinkedList mylist=new LinkedList();LinkedList(); 7.4 LinkedList泛型类 创建一个空双链表。然后创建一个空双链表。然后mylistmylist可可以使用以使用add(String obj)add(St

12、ring obj)方法向链表方法向链表依次增加节点,节点中的数据是参依次增加节点,节点中的数据是参数数objobj指定对象的引用,如:指定对象的引用,如: mylist.add(mylist.add(“HowHow”);); mylist.add(mylist.add(“AreAre”);); mylist.add(mylist.add(“YouYou”);); 7.4 LinkedList泛型类 mylist.add(“Java”); 这时,双链表这时,双链表mylistmylist就有了就有了4 4个个节点,节点是自动连接在一起的,节点,节点是自动连接在一起的,不需要我们再去做连接。也就是

13、说,不需要我们再去做连接。也就是说,不需要我们去操作安排节点中所存不需要我们去操作安排节点中所存放的下一个或上一个节点的引用。放的下一个或上一个节点的引用。 7.4 LinkedList泛型类 2 2、常用方法、常用方法 以下是以下是LinkedListLinkedList泛型类的泛型类的一些常用方法:一些常用方法: public boolean add(E public boolean add(E element)element)向链表的末尾添加一向链表的末尾添加一个新的节点,该节点中的数据是参个新的节点,该节点中的数据是参数数elementelement指定的对象。指定的对象。 7.4 L

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

15、加一个新的节点,该节点中的数据是参个新的节点,该节点中的数据是参数数elementelement指定的对象。指定的对象。 public void clear()删除链删除链表中的所有节点,使当前链表成为表中的所有节点,使当前链表成为空链表。空链表。 7.4 LinkedList泛型类 public E remove(int index)删除链表中指定位置上的节点。删除链表中指定位置上的节点。 public boolean remove(E element)删除首次出现含有数删除首次出现含有数据据elementelement的节点。的节点。 public E removeFirst()删除删除链

16、表中第一个节点,并返回这个节链表中第一个节点,并返回这个节点中的对象。点中的对象。 7.4 LinkedList泛型类 public E removeLast()删除链删除链表中最后一个节点,并返回这个节表中最后一个节点,并返回这个节点中的对象。点中的对象。 public E get(int index)得到得到链表中指定位置处节点中的对象。链表中指定位置处节点中的对象。 public E getFirst()得到链表得到链表中第一个节点的对象。中第一个节点的对象。 7.4 LinkedList泛型类 public E getLast()得到链表中最后一得到链表中最后一个节点的对象。个节点的对

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

18、链表indexindex位位置节点中的对象替换为参数置节点中的对象替换为参数elementelement指定的对象,并返回被替换的对象。指定的对象,并返回被替换的对象。 public int size()返回链表的返回链表的长度,即节点的个数。长度,即节点的个数。 7.4 LinkedList泛型类 public boolean contains(Object element)判断链表节点中是否判断链表节点中是否有节点含有对象有节点含有对象elementelement。 public Object clone()得到当得到当前链表的一个克隆链表,该克隆链前链表的一个克隆链表,该克隆链表中的节点

19、数据的改变不会影响到表中的节点数据的改变不会影响到当前链表中节点的数据,反之亦然。当前链表中节点的数据,反之亦然。 例例7 7- -7 7: import java.util.*; class Student String name; int score; Student(String name,int score) this.name=name; this.score=score; 例例7 7- -6 6: public class Example7_7 public static void main(String args) LinkedList mylist=new LinkedList

20、(); Student stu1=new Student(张小一张小一,78), stu2=new Student(王小二王小二,98), stu3=new Student(李大山李大山,67); mylist.add(stu1); mylist.add(stu2); 例例7 7- -7 7: mylist.add(stu3); int number=mylist.size(); System.out.println(现在链表中有现在链表中有+number+个节点个节点:); for(int i=0;inumber;i+) Student temp=mylist.get(i); System.

21、out.printf(第第+i+节点中的数节点中的数据据,学生学生:%s,分分数数:%dn,temp.name,temp.score); 例例7 7- -7 7: Student removeSTU=mylist.remove(1); System.out.printf(被删除的节点中的数据被删除的节点中的数据是是:%s,%dn,removeSTU.name,removeSTU.score); Student replaceSTU=mylist.set(1,new Student(赵钩林赵钩林,68); System.out.printf(被替换的节点中的数据被替换的节点中的数据是是:%s,%

22、dn,replaceSTU.name,replaceSTU.score); number=mylist.size(); 例例7 7- -7 7: System.out.println(现在链表中有现在链表中有+number+个节点个节点:); for(int i=0;inumber;i+) Student temp=mylist.get(i); System.out.printf(第第+i+节点中的数据节点中的数据,学学生生:%s,分数分数:%dn,temp.name,temp.score); 例例7 7- -7 7: if(mylist.contains(stu1) System.out.p

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

24、该对象中每个数据成员刚好是链表节点中的数据,而且这些数据成员链表节点中的数据,而且这些数据成员是按顺序存放在是按顺序存放在Iterator对象中的。对象中的。 7.4 LinkedList泛型类 如果链表是“如果链表是“Student类型”的链表,即类型”的链表,即链表节点中的数据是链表节点中的数据是Student类创建的对类创建的对象,那么该链表使用象,那么该链表使用iterator()方法返回方法返回一个一个Iterator类型的对象,该类型的对象,该对象使用对象使用next()方法遍历链表。方法遍历链表。 例例7 7- -8 8:遍历链表。:遍历链表。 import java.util.

25、*; class Student String name ; int number; float score; Student(String name,int number,float score) this.name=name; this.number=number; this.score=score; 例例7 7- -8 8:遍历链表。:遍历链表。 public class Example7_8 public static void main(String args) LinkedList mylist=new LinkedList(); Student stu_1=new Student

26、(赵民赵民 ,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 7- -8 8:遍历链表。:遍历链表。 mylist.add(stu_1); mylist.add(stu_2); mylist.add(stu_3); mylist.add(stu_4); Iterator iter=mylist.iterator(); 例例7 7- -8 8:遍历链表。:遍历链表。 while(iter.h

27、asNext() Student te=iter.next(); /使用使用next()方法遍历链表。方法遍历链表。 System.out.println(te.name+ +te.number+ +te.score); 7.4 LinkedList泛型类 4、LinkedList泛型类实现的接口泛型类实现的接口 LinkedList泛型类实现了泛型接口泛型类实现了泛型接口List,而,而List接口是接口是Collection接接口的子接口。口的子接口。LinkedList类中的绝大部分类中的绝大部分方法都是接口方法的实现。编程时,可以使方法都是接口方法的实现。编程时,可以使用接口回调技术,

28、即把用接口回调技术,即把LinkedList对象的对象的引用赋值给引用赋值给Collection接口或接口或List接接口变量,那么接口就可以调用实现的接口方口变量,那么接口就可以调用实现的接口方法。法。 7.4 LinkedList泛型类 5、JDK 1.5之前的之前的LinkedList类类 JDK 1.5之前没有泛型的之前没有泛型的LinkedList类,可类,可以用普通的以用普通的LinkedList创建一个链表对象,创建一个链表对象,如:如: LinkedList mylist=new LinkedList(); 创建了一个空双链表,然后创建了一个空双链表,然后mylist链表可以链

29、表可以使用使用add(Object obj)方法向这个链表依次添方法向这个链表依次添加节点。加节点。 7.4 LinkedList泛型类 由于任何类都是由于任何类都是Object类的子类,因此类的子类,因此可以把任何一个对象作为链表节点中的可以把任何一个对象作为链表节点中的对象。需要注意的是,使用对象。需要注意的是,使用get()获取一获取一个节点中的对象时,要用类型转制运算个节点中的对象时,要用类型转制运算符转换回原来的类型。符转换回原来的类型。 7.4 LinkedList泛型类 Java泛型的主要目的是可以建立具有泛型的主要目的是可以建立具有类型安全的集合框架,如链表、散列表类型安全的集

30、合框架,如链表、散列表等数据结构,最重要的一个优点就是:等数据结构,最重要的一个优点就是:在使用这些泛型类建立的数据结构时,在使用这些泛型类建立的数据结构时,不必进行强制类型转换,即不要求进行不必进行强制类型转换,即不要求进行运行时类型检查。运行时类型检查。 7.4 LinkedList泛型类 JDK 1.5是支持泛型的编译器,它将运行是支持泛型的编译器,它将运行时类型检查提前到编译时执行,使得代时类型检查提前到编译时执行,使得代码更加安全。如果使用旧版本的码更加安全。如果使用旧版本的LinkedList类,类,SDK 1.5编译器会给出警编译器会给出警告信息,但程序仍能正常运行。告信息,但程

31、序仍能正常运行。 例例7 7- -9 9:旧版本:旧版本LinkedListLinkedList的例子。的例子。 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(do

32、or); /链表中的第四个节点。链表中的第四个节点。 int number=mylist.size(); /获取链表的长度。获取链表的长度。 例例7 7- -8 8:旧版本:旧版本LinkedListLinkedList的例子。的例子。 for(int i=0;inumber;i+) String temp=(String)mylist.get(i); /必须强必须强制转换取出的数据。制转换取出的数据。 System.out.println(第第+i+节点中的数节点中的数据据:+temp); 例例7 7- -8 8:旧版本:旧版本LinkedListLinkedList的例子。的例子。 Ite

33、rator iter=mylist.iterator(); while(iter.hasNext() String te=(String)iter.next(); /必须强制转换取出的数据。必须强制转换取出的数据。 System.out.println(te); 7.4 LinkedList泛型类 注:注:Java也提供了顺序结构的动态数组类也提供了顺序结构的动态数组类ArrayList,数组采用顺序结构来存储数,数组采用顺序结构来存储数据。可以有效利用空间,可用于存储大量的据。可以有效利用空间,可用于存储大量的数据。数组不适合动态改变它存储的数据,数据。数组不适合动态改变它存储的数据,如增加

34、、删除单元等。由于数组采用顺序结如增加、删除单元等。由于数组采用顺序结构存储数据,数组获得第构存储数据,数组获得第n单元中的数据的单元中的数据的速度要比链表获得第速度要比链表获得第n单元中的数据快。类单元中的数据快。类ArrayList的很多方法与类的很多方法与类LinkedList类类似,两者的本质区别就是:一个使用顺序结似,两者的本质区别就是:一个使用顺序结构,一个使用链表结构。构,一个使用链表结构。 Set接口 Set接口是接口是Collection的子接口,的子接口,Set内的元素内的元素是唯一的。是唯一的。 Set接口并没有对接口并没有对Collection接口进行扩展,接口进行扩展

35、,但在具体方法的含义上进行了进一步的约定。但在具体方法的含义上进行了进一步的约定。 7.5 HashSet泛型类 HashSet泛型类在数据组织上类似数学泛型类在数据组织上类似数学上的集合,可以进行“交”、“并”、“差”上的集合,可以进行“交”、“并”、“差”等运算。等运算。 1、HashSet对象对象 HashSet泛型类创建的对象称为集合,泛型类创建的对象称为集合,例如:例如: HashSet set=new HashSet(); 7.5 HashSet泛型类 那么那么set就是一个可以存储就是一个可以存储String类型数据的类型数据的集合,集合,set可以调用可以调用add(Strin

36、g s)方法将方法将String类型数据添加到集合中,添加到集合中的数类型数据添加到集合中,添加到集合中的数据称做集合的元素。集合不允许有相同的元据称做集合的元素。集合不允许有相同的元素,也就是说,如果素,也就是说,如果b已经是集合中的元素,已经是集合中的元素,那么再执行那么再执行set.add(b)操作是无效的。集合对操作是无效的。集合对象的初始容量是象的初始容量是16个字节,装载因子是个字节,装载因子是0.75。也就是说,如果集合添加的元素超过总容量也就是说,如果集合添加的元素超过总容量的的75时,集合的容量将增加一倍。时,集合的容量将增加一倍。 7.5 HashSet泛型类 2、常用方法

37、、常用方法 以下是以下是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)删除集合中

38、参数指定的元素。删除集合中参数指定的元素。 7.5 HashSet泛型类 public int size()返回集合中的元素个返回集合中的元素个数。数。 Object toArray()将集合元素存放到将集合元素存放到数组中,并返回这个数组。数组中,并返回这个数组。 boolean containsAll(HashSet set)判判断当前集合是否包含参数指定的集合断当前集合是否包含参数指定的集合。 public Object clone()得到当前集合的得到当前集合的一个克隆对象,该对象中元素的改变不会影一个克隆对象,该对象中元素的改变不会影响到当前集合中的元素,反之亦然。响到当前集合中的元

39、素,反之亦然。 7.5 HashSet泛型类 我们可以借助泛型类我们可以借助泛型类Iterator实实现遍历集合,一个集合对象可以使用现遍历集合,一个集合对象可以使用iterator()方法返回一个方法返回一个Iterator类型类型的对象,如果集合是“的对象,如果集合是“Student类型”的类型”的集合,那么该链表使用集合,那么该链表使用iterator()方法返方法返回一个回一个Iterator类型的对象,类型的对象,该对象使用该对象使用next()方法遍历集合。方法遍历集合。 例例7 7- -1010:遍历集合。:遍历集合。 import java.util.*; class Stud

40、ent String name; int score; Student(String name,int score) this.name=name; this.score=score; 例例7 7- -1010:遍历集合。:遍历集合。 public class Example7_10 public static void main(String args) Student zh=new Student(张红铭张红铭,77), wa=new Student(王家家王家家,68), li=new Student(李佳佳李佳佳,67); HashSet set=new HashSet(); Hash

41、Set subset=new HashSet(); 例例7 7- -1010:遍历集合。:遍历集合。 set.add(zh); set.add(wa); set.add(li); subset.add(wa); subset.add(li); if(set.contains(wa) System.out.println(集合集合set中含中含有有:+wa.name); 例例7 7- -1010:遍历集合。:遍历集合。 if(set.containsAll(subset) System.out.println(集合集合set包含集合包含集合subset); int number=subset.s

42、ize(); System.out.println(集合集合subset中有中有+number+个元素个元素:); Object s=subset.toArray(); 例例7 7- -1010:遍历集合。:遍历集合。 for(int i=0;is.length;i+) System.out.printf(姓名姓名:%s,分分数数:%dn,(Student)si).name,(Student)si).score); number=set.size(); System.out.println(集合集合set中有中有+number+个元素个元素:); 例例7 7- -1010:遍历集合。:遍历集合

43、。 Iterator iter=set.iterator(); while(iter.hasNext() Student te=iter.next(); System.out.printf(学生学生:%s,分分数数:%dn,te.name,te.score); 7.5 HashSet泛型类 3、集合的交、并与差、集合的交、并与差 集合对象调用集合对象调用boolean addAll(HashSet set)方法可以与参数指定方法可以与参数指定的集合求并运算,使得当前集合成为两的集合求并运算,使得当前集合成为两个集合的并集。个集合的并集。 集合对象调用集合对象调用boolean retainAl

44、l(HashSet set)方法可以与参数指方法可以与参数指定的集合求交运算,使得当前集合成为定的集合求交运算,使得当前集合成为两个集合的交集。两个集合的交集。 7.5 HashSet泛型类 集合对象调用集合对象调用boolean removeAll(HashSet set)方法可以与参数方法可以与参数指定的集合求差运算,使得当前集合成指定的集合求差运算,使得当前集合成为两个集合的差集。(属于集合为两个集合的差集。(属于集合A,但,但不属于集合不属于集合B的部分。)的部分。) 参数指定的集合必须与当前集合是同参数指定的集合必须与当前集合是同种类型的集合,否则上述方法返回种类型的集合,否则上述方

45、法返回false。 例例7 7- -1111:求集合:求集合A A、B B的对称差集合,即求的对称差集合,即求(A(A- -B)(BB)(B- -A)A)。 import java.util.*; public class Example7_11 public static void main(String args) Integer one=new Integer(1), two=new Integer(2), three=new Integer(3), four=new Integer(4), five=new Integer(5), six=new Integer(6); 例例7 7-

46、-1111:求集合:求集合A A、B B的对称差集合,即求的对称差集合,即求(A(A- -B)(BB)(B- -A)A)。 HashSet A=new HashSet(), B=new HashSet(), tempSet=new HashSet(); A.add(one); A.add(two); A.add(three); A.add(four); B.add(one); B.add(two); 例例7 7- -1111:求集合:求集合A A、B B的对称差集合,即求的对称差集合,即求(A(A- -B)(BB)(B- -A)A)。 B.add(five); B.add(six); temp

47、Set=(HashSet)A.clone(); A.removeAll(B); /A变成调用该方法之前的变成调用该方法之前的A集合与集合与B集合的集合的差集。差集。 B.removeAll(tempSet); /B变成调用该方法之前的变成调用该方法之前的B集合与集合与tempSet集集合的差集。合的差集。 例例7 7- -1111:求集合:求集合A A、B B的对称差集合,即求的对称差集合,即求(A(A- -B)(BB)(B- -A)A)。 B.addAll(A); /B就是最初的就是最初的A与与B的对称差。的对称差。 int number=B.size(); System.out.print

48、ln(A和和B的对称差集合的对称差集合有有+number+个元素个元素:); Iterator iter=B.iterator(); while(iter.hasNext() Integer te=iter.next(); System.out.printf(%d,,te.intValue(); 7.5 HashSet泛型类 请同学们思考,为什么在这个请同学们思考,为什么在这个地方不能直接把数据添加到集合当地方不能直接把数据添加到集合当中去?中去? 7.5 HashSet泛型类 4、HashSet泛型类实现的接口泛型类实现的接口 HashSet泛型类实现了泛型接口泛型类实现了泛型接口Set,而

49、,而Set接口是接口是Collection接口的子接口。接口的子接口。HashSet类中的绝大类中的绝大部分方法都是接口方法的实现。编程时,部分方法都是接口方法的实现。编程时,可以使用接口回调技术,即把可以使用接口回调技术,即把HashSet对象的引用赋值给对象的引用赋值给Collection接口变量或接口变量或Set接口变接口变量,那么接口就可以调用实现的接口方量,那么接口就可以调用实现的接口方法。法。 7.6 HashMap泛型类 HashMap也是一个很实用的也是一个很实用的类,类,HashMap对象采用散列表这对象采用散列表这种数据结构存储数据,习惯上称种数据结构存储数据,习惯上称Ha

50、shMap对象为散列映射对象。对象为散列映射对象。散列映射用于存储键散列映射用于存储键/值数据对,允许把值数据对,允许把任何数量的键任何数量的键/值数据对存储在一起。键值数据对存储在一起。键不可以发生逻辑冲突,两个数据项不要不可以发生逻辑冲突,两个数据项不要使用相同的键,如果出现两个数据项对使用相同的键,如果出现两个数据项对应相同的键,那么先前散列映射中的键应相同的键,那么先前散列映射中的键/值数据对将被替换。值数据对将被替换。 7.6 HashMap泛型类 散列映射在它需要更多的存储空间散列映射在它需要更多的存储空间时会自动增加容量。例如,如果散列映时会自动增加容量。例如,如果散列映射的装载

51、因子是射的装载因子是0.75,那么当散列映射,那么当散列映射的容量被使用了的容量被使用了75时,它就把容量增时,它就把容量增加到原始容量的加到原始容量的2倍。对于数组和链表这倍。对于数组和链表这两种数据结构,如果要查找它们存储的两种数据结构,如果要查找它们存储的某个特定的元素却不知道它的位置,就某个特定的元素却不知道它的位置,就需要从头开始访问元素直到找到匹配的需要从头开始访问元素直到找到匹配的为止;如果数据结构中包含很多的元素,为止;如果数据结构中包含很多的元素,就会浪费时间。就会浪费时间。 7.6 HashMap泛型类 这时最好使用散列映射来存储要查找的这时最好使用散列映射来存储要查找的数

52、据,使用散列映射可以减少检索的开数据,使用散列映射可以减少检索的开销。销。 散列方法不同于其他的查找方法散列方法不同于其他的查找方法(顺序查找、二分查找)。它不以关键(顺序查找、二分查找)。它不以关键字的比较为基本操作,采用直接寻址技字的比较为基本操作,采用直接寻址技术。在理想情况下,无须任何比较就可术。在理想情况下,无须任何比较就可以找到待查关键字。以找到待查关键字。 7.6 HashMap泛型类 1、HashMap对象对象 HashMap泛型类创建的对象称泛型类创建的对象称为散列映射,例如:为散列映射,例如: HashMap hashtable=new HashMap (); 7.6 Ha

53、shMap泛型类 那么,那么,hashtable就可以存储键就可以存储键/值数据对,值数据对,其中的键必须是一个其中的键必须是一个String对象,键对对象,键对应的值必须是应的值必须是Student对象。对象。hashtable可可以调用以调用public V put(K key,V value)将键将键/值数据对存放到散列映射当中,同时返值数据对存放到散列映射当中,同时返回键所对应的值。回键所对应的值。 7.6 HashMap泛型类 2、常用方法、常用方法 HashMap泛型类的常用方法:泛型类的常用方法: public void clear()清空散列映射。清空散列映射。 public

54、Object clone()返回当前散列返回当前散列映射的一个克隆。映射的一个克隆。 7.6 HashMap泛型类 public boolean containsKey(Object key)如果散列映射有键如果散列映射有键/值数据对的值数据对的值是参数指定的键,方法返回值是参数指定的键,方法返回true,否,否则返回则返回false。 public boolean containsValue(Object value)如果散列映射有键如果散列映射有键/值数据对值数据对的值是参数指定的值,方法返回的值是参数指定的值,方法返回true,否则返回否则返回false。 7.6 HashMap泛型类

55、public V get(Object key)返回散列返回散列映射中使用映射中使用key作为键的键作为键的键/值对中的值。值对中的值。 public boolean isEmpty()如果散列如果散列映射不含任何键映射不含任何键/值对,方法返回值对,方法返回true,否则返回否则返回false。 7.6 HashMap泛型类 public V remove(Object key)删除删除散列映射中键为参数指定的键散列映射中键为参数指定的键/值对,并值对,并返回键对应的值。返回键对应的值。 public int size()返回散列映射的大返回散列映射的大小,即散列映射中键小,即散列映射中键/

56、值对的数目。值对的数目。 7.6 HashMap泛型类 3、遍历散列映射、遍历散列映射 如果想获得散列映射中所有键如果想获得散列映射中所有键/值对中的值,值对中的值,首先使用:首先使用: public Collection values() 方法返回一个实现方法返回一个实现Collection接口类创建接口类创建的对象的引用,并要求将该对象的引用返回的对象的引用,并要求将该对象的引用返回到到Collection接口变量中。接口变量中。values()方法返方法返回的对象中存储了散列映射中所有键回的对象中存储了散列映射中所有键/值对中值对中的“值”,这样接口变量就可以调用类实现的“值”,这样接口

57、变量就可以调用类实现的方法,如获取的方法,如获取Iterator对象,然后输出所有对象,然后输出所有的值。的值。 例例7 7- -1212:遍历散列映射。:遍历散列映射。 import java.util.*; class Book String ISBN,name; Book(String ISBN,String name) this.name=name; this.ISBN=ISBN; 例例7 7- -1212:遍历散列映射。:遍历散列映射。 public class Example7_12 public static void main(String args) Book book1=n

58、ew Book(7302033218,C+基基础教程础教程), book2=new Book(7808315162,Java编程编程语言语言), book3=new Book(7302054991,J2ME无线无线设备编程设备编程); String key=7808315162; 例例7 7- -1212:遍历散列映射。:遍历散列映射。 HashMap table=new HashMap(); table.put(book1.ISBN,book1); table.put(book2.ISBN,book2); table.put(book3.ISBN,book3); if(table.conta

59、insKey(key) System.out.println(table.get(key).name+有货有货); 例例7 7- -1212:遍历散列映射。:遍历散列映射。 Book b=table.get(7302054991); System.out.println(书书名名:+b.name+,ISBN:+b.ISBN); int number=table.size(); System.out.println(散列映射中有散列映射中有+number+个元素个元素:); Collection collection=table.values(); 例例7 7- -1212:遍历散列映射。:遍历

60、散列映射。 Iterator iter=collection.iterator(); while(iter.hasNext() Book te=iter.next(); System.out.printf(书书名名:%s,ISBN:%sn,te.name,te.ISBN); 7.6 HashMap泛型类 4、HashMap泛型类实现的接口泛型类实现的接口 HashMap泛型类实现了泛型接泛型类实现了泛型接口口Map,而,而HashMap类中类中的绝大部分方法都是的绝大部分方法都是Map接口方接口方法的实现。编程时,可以使用接口回调法的实现。编程时,可以使用接口回调技术,即把技术,即把HashM

61、ap对象的引用对象的引用赋值给赋值给Map接口变量,那么接口接口变量,那么接口就可以调用实现的接口方法。就可以调用实现的接口方法。 7.7 TreeSet泛型类 TreeSet类是实现类是实现Set接口的类,接口的类,它的大部分方法都是接口方法的实现。它的大部分方法都是接口方法的实现。TreeSet泛型类创建的对象称为树集。泛型类创建的对象称为树集。 树集是一个有序集合,可以按照任树集是一个有序集合,可以按照任何顺序将元素插入到该集合。何顺序将元素插入到该集合。 7.7 TreeSet泛型类 例如:例如: TreeSet tree=new TreeSet(); 那么那么tree就是一个可以存储

62、就是一个可以存储Student类型类型数据的集合,数据的集合,tree可以调用可以调用add(Student s)方法将方法将Student类型的数据添加到树集中。类型的数据添加到树集中。存放到树集的对象按对象的串表示升序存放到树集的对象按对象的串表示升序排列。排列。 7.7 TreeSet泛型类 TreeSet要求添加到树集中的节点要求添加到树集中的节点对象必须实现对象必须实现Comparable接口,也就是接口,也就是创建实现创建实现Comparable接口类的对象。比接口类的对象。比如,如,String类实现了类实现了Comparable接口中接口中的的compareTo(Object

63、str)方法,字符串方法,字符串调用调用compareTo(String s)方法按字典序方法按字典序与参数与参数s指定的字符串比较大小。也就是:指定的字符串比较大小。也就是: 7.7 TreeSet泛型类 TreeSet mytreenew TreeSet(); 然后就可以使用然后就可以使用add()方法向树集中添加方法向树集中添加节点了。节点了。 Comparable 接口强行对实现它的接口强行对实现它的每个类的对象进行整体排序。此排序被每个类的对象进行整体排序。此排序被称为该类的自然排序,类的称为该类的自然排序,类的 compareTo 方法被称为它的自然比较方法。方法被称为它的自然比较

64、方法。 7.7 TreeSet泛型类 TreeSet泛型类的常用方法:泛型类的常用方法: public boolean add(E o)向树集添向树集添加对象,添加成功返回加对象,添加成功返回true,否则返回,否则返回false。 public void clear()删除树集中的所删除树集中的所有对象。有对象。 7.7 TreeSet泛型类 public boolean contains(Object o)如果包含对象如果包含对象o方法返回方法返回true,否则返回,否则返回false。 public E first()返回树集中的第一返回树集中的第一个对象(最小的对象)。个对象(最小的对

65、象)。 public E last()返回树集中的最后一返回树集中的最后一个对象(最大的对象)。个对象(最大的对象)。 7.7 TreeSet泛型类 public boolean isEmpty()判断是否判断是否是空树集,如果树集不含对象返回是空树集,如果树集不含对象返回true。 public boolean remove(Object o)删删除树集中的对象除树集中的对象o。 public int size()返回树集中的对象返回树集中的对象数目。数目。 7.7 TreeSet泛型类 我们在创建树集时可自己规定树集我们在创建树集时可自己规定树集中的对象按照什么样的顺序排列,要求中的对象按

66、照什么样的顺序排列,要求添加到树集中的节点对象必须实现添加到树集中的节点对象必须实现Comparable接口类的实例,也就是实现接口类的实例,也就是实现Comparable接口类所创建的对象。假如接口类所创建的对象。假如我们有我们有4个学生对象,他们有姓名和成绩,个学生对象,他们有姓名和成绩,我们想把这我们想把这4个对象添加到树集中,并按个对象添加到树集中,并按照成绩的高低排列,而不是按照姓名的照成绩的高低排列,而不是按照姓名的字典序排列节点。字典序排列节点。 7.7 TreeSet泛型类 首先创建学生的首先创建学生的Student类实现接口类实现接口Comparable。Comparable接口有一个接口有一个方法:方法: public int compareTo(Object b); Student类通过实现这个接口来规定它创类通过实现这个接口来规定它创建的对象的大小关系,如下所示:建的对象的大小关系,如下所示: 7.7 TreeSet泛型类 class Student implement Comparable int english=0; String name; Student

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!