资源描述
,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,2018/1/31 Wednesday,第,#,页,#,单击此处编辑母版标题样式,2024/8/13,JAVA程序设计根底 第15章,泛型与集合框架,导读,2024/8/13,主要内容,泛型,链表,堆栈,散列映射,树集,树映射,概述,2024/8/13,在,jdk1.2,之后,,Java,提供了实现常见数据结构的类,这些实现数据结构的类通称为,Java,集合框架。在,JDK1.5,后,,Java,集合框架开始支持泛型,本章首先介绍泛型,然后讲解常见数据结构类的用法。,2024/8/13,15.1,泛型,泛型Generics是在JDK1.5中推出的,其主要目的是可以建立具有类型平安的集合框架,如链表、散列映射等数据结构。,2024/8/13,15.1.1,泛型类声明,可以使用“class 名称声明一个类,为了和普通的类有所区别,这样声明的类称作泛型类,如:,class People,其中People是泛型类的名称,E是其中的泛型,也就是说我们并没有指定E是何种类型的数据,它可以是任何对象或接口,但不能是根本类型数据。,2024/8/13,15.1.2,使用泛型类声明对象,泛型类声明和创立对象时,类名后多了一对“,而且必须要用具体的类型替换“中的泛型。例如:,Cone coneOne;,coneOne =new Cone(new Circle();,例子,1,(,Example15_1.java,Cone.java,Rect.java,Circle.java,),中,声明了一个泛型类:,Cone,,,一个,Cone,对象计算体积时,只关心它的底是否能计算面积,并不关心底的类型。运行效果如图,15.1,。,2024/8/13,15.2,链表,链表是由假设干个称作节点的对象组成的一种数据结构,每个节点含有一个数据和下一个节点的引用 。,2024/8/13,15.2.1,LinkedList,泛型类, LinkedList泛型类创立的对象以链表结构存储数据,习惯上称LinkedList类创立的对象为链表对象。例如,,LinkedList mylist=new LinkedList();,创立一个空双链表。, add(E obj) 向链表依次增加节点,2024/8/13,15.2.2,常用方法,LinkedList,泛型类实现,Lis,泛型接口中的一些常用方法。,public boolean add(E element),向链表末尾添加一个新的节点,该节点中的数据是参数,elememt,指定的数据。,public void add(int index ,E element),向链表的指定位置添加一个新的节点,该节点中的数据是参数,elememt,指定的数据。,public void clear(),删除链表的所有节点,使当前链表成为空链表。,public E remove(int index),删除指定位置上的节点。,public boolean remove(E element),删除首次出现含有数据,elemen,的节点。,public E get(int index),得到链表中指定位置处节点中的数据。,LinkedList,泛型类本身新增加的一些常用方法,public void addFirst(E element),向链表的头添加新节点,该节点中的数据是参数,elememt,指定的数据。,public void addLast(E element),向链表的末尾添加新节点,该节点中的数据是参数,elememt,指定的数据。,public E getFirst(),得到链表中第一个节点中的数据。,public E getLast(),得到链表中最后一个节点中的数据。,public E removeFirst(),删除第一个节点,并返回这个节点中的数据。,2024/8/13,15.2.3,遍历链表, 当用户需要遍历集合中的对象时,应当使用该集合提供的迭代器,而不是让集合本身来遍历其中的对象。由于迭代器遍历集合的方法在找到集合中的一个对象的同时,也得到待遍历的后继对象的引用,因此迭代器可以快速地遍历集合。, 链表对象可以使用iterator()方法获取一个Iterator对象,该对象就是针对当前链表的迭代器。,例子2 比较了使用迭代器遍历链表和get(int index)方法遍历链表的所用时间,运行效果如图15.4。,例子3 使用了JDK1.5版本之前的LinkedList。,2024/8/13,15.2.,4,排序与查找,Collections类提供的用于排序和查找的类方法如下:,public static sort(List list) 该方法可以将list中的元素升序排列。,int binarySearch(List list, T key,CompareTo c) 使用折半法查找list是否含有和参数key相等的元素,如果key链表中某个元素相等,方法返回和key相等的元素在链表中的索引位置链表的索引位置从0考试,否那么返回-1。,例子4中,Student类通过实现Comparable接口规定该类的对象的大小关系按height值的大小确定大小关系,即学生按其身高确定之间的大小关系。链表添加了3个Student对象,Collections调用sort方法将链表中的对象按身其height值升序排序,并查找一个对象的height值是否和链表中某个对象的height值相同。运行效果如图15.5。,2024/8/13,15.2.,5,洗牌与旋转,Collections,类还提供了将链表中的数据重新随机排列的类方法以及旋转链表中数据的类方法。,public static void shuffle(List list),将,list,中的数据按洗牌算法重新随机排列。,static void rotate(List list, int distance),旋转链表中的数据。,public static void reverse(List list),翻转,list,中的数据。,例子5,使用了,shuffle(),方法、,reverse(),方法和,rotate(),方法,运行效果如图,15.6,。,2024/8/13,15.3,堆栈,堆栈是一种“后进先出的数据结构,只能在一端进行输入或输出数据的操作。,Stack泛型类创立一个堆栈对象,堆栈对象常用方法:,public E push(E item);实现压栈操作,public E pop();实现弹栈操作。,public boolean empty();判断堆栈是否还有数据。,public E peek();获取堆栈顶端的数据,但不删除该数据。,public int search(Object data);获取数据在堆栈中的位置。,例子6 用堆栈输出该递归序列的假设干项,2024/8/13,15.4,散列映射,15.4.1,HashMap,泛型类,HashMap对象采用散列表这种数据结构存储数据,习惯上称HashMap对象为散列映射。,例如:,HashMap hashtable,= HashSet();,hashtable可以存储“键/值对数据。,相关方法:,public V put(K key,V value)将键/值对数据存放到散列映射中,该方法同时返回键所对应的值。,2024/8/13,15.4.2,常用方法,public void clear() 清空散列映射。,public Object clone() 返回当前散列映射的一个克隆。,public boolean containsKey(Object key) 如果散列映射有“键/值对使用了参数指定的键,方法返回true,否那么返回false。,public boolean containsValue(Object value) 如果散列映射有“键/值对的值是参数指定的值。,public V get(Object key) 返回散列映射中使用key做键的“键/值对中的值。,public boolean isEmpty() 如果散列映射不含任何“键/值对,方法返回true,否那么返回false。,public V remove(Object key) 删除散列映射中键为参数指定的“键/值对,并返回键对应的值。,public int size() 返回散列映射的大小,即散列映射中“键/值对的数目。,2024/8/13,1,5.4.3,遍历散列映射,public Collection values()方法返回一个实现Collection接口类创立的对象。,使用接口回调技术,即将该对象的引用赋给Collection接口变量,该接口变量可以回调iterator()方法获取一个Iterator对象,这个Iterator对象存放着散列映 射中所有“键/值对中的“值。,2024/8/13,1,5.4.4,基于散列映射的查询,对于经常需要进行查找的数据可以采用散列映射来存储这样的数据,即为数据指定一个查找它的关键字,然后按着“健-值对,将关键字和数据一并存入散列映射中。,例子,7 (,Example15_7.java,WindowWord.java,WordPolice.java,word.txt,),例子7 是一个英语单词查询的GUI程序,用户在界面的的一个文本框中输入一个英文单词回车确认,另一个文本框显示英文单词的汉语翻译。例子7中使用一个文本文件word.txt来管理假设干个英文单词及汉语翻译,2024/8/13,15.5,树集,15.5.1,TreeSet,泛型类,TreeSet类创立的对象称作树集。,例如,TreeSet mytree=new TreeSe();,然后使用add方法为树集添加节点,例如,mytree.add(boy);,2024/8/13,15.5.2,节点的大小关系,树集用add方法添加节点,节点会按其存放的数据的“大小顺序一层一层地依次排列,在同一层中的节点从左到右按“大小顺序递增排列,下一层的都比上一层的小。,2024/8/13,15.5.3,TreeSet,类的常用方法,public boolean add(E o) 向树集添加加节点。,public void clear() 删除树集中的所有节点。,public void contains(Object o) 如果树集中有包含参数指定的对象,该方法返回true,否那么返回false 。,public E first() 返回树集中的第一个节点中的数据最小的节点。,public E last() 返回最后一个节点中的数据最大的节点。,public isEmpty() 判断是否是空树集,如果树集不含任何节点,该方法返回true 。,public boolean remove(Object o) 删除树集中的存储参数指定的对象的最小节点。,public int size() 返回树集中节点的数目。,例子8 中的树集按着英语成绩从底到高存放四个Student对象。,2024/8/13,15.6,树映射,TreeMap,类,实现了,Map,接口,,称,TreeMap,对象为树映射。,树映射使用,public V put(K key,V value);,方法添加节点。,例子,9,使用了,TreeMap,,分别按着学生的英语成绩和数学成绩排序节点。,2024/8/13,15.7,自动装箱与拆箱,JDK1.5新增的根本类型数据和相应的对象之间相互自动转换的功能,称作根本数据类型的自动装箱与拆箱Autoboxing and Auto-Unboxing of Primitive Types。,例子10 使用了自动装箱与拆箱。,2024/8/13,15. 8,应用举例,例子11(,Example15_11.java,Goods.java,InputArea.java,WindowGoods.java,),使用对象流实现商品库存的录入与显示系统。例子4中有一个实现接口,Serializable,的,Goods,类,程序将该类的对象作为链表的节点,然后把链表写入到文件。运行效果如图15.12。,
展开阅读全文