Java面向对象程序设计第13章_泛型与集合框架资料
集合框架和泛型专题讲座
![集合框架和泛型专题讲座](https://img.taocdn.com/s3/m/2cfa0f7b102de2bd97058863.png)
24/17
练习2:使用泛型修改根据学员姓名找学员对象
需求说明
学员应聘至外企工作,每个学员都会有一个英文名称, 对应该学员对象。请实现通过英文名称,获得该学员对 象的详细信息
学员属性包括姓名以及性别 通过泛型解决该问题
32/ 38
25/17
总结
Collection 、List 、Set 、Map接口的联系和区别 遍历集合的方法 泛型集合用法及好处
19/ 38
12/21
Set接口1
Set接口存储一组唯一,无序的对象
HashSet是Set接口常用的实现类
Set中存放对象的引用
Set set=new HasБайду номын сангаасSet();
String s1=new String("java");
String s2=s1;
String s3=new String("JAVA");
Set set=new HashSet();
String s1=new String("java");
String s2=s1;
String s3=new String ("java");
set.add(s1);
set.add(s2);
set.add(s3);
System.out.println(set.size());
使用集合类
需要遍历元素 类型:新闻标题
属性:ID、名称、创建者
演示示例1:ArrayList获取并打印新闻标题
11 / 38
6/21
ArrayList集合类2
确定存储方式
ArrayList类是List接口的一个具体实现类 ArrayList对象实现了可变大小的数组 随机访问和遍历元素时,它提供更好的性能
Java面向对象程序设计第2版第13章_泛型与集合框架
![Java面向对象程序设计第2版第13章_泛型与集合框架](https://img.taocdn.com/s3/m/5c17c87a195f312b3169a5b2.png)
2020/8/24
9
§13.2.2 常用方法
◆ LinkedList<E>泛型类实现Lis<E>泛型接口中的一些常用方法。
public boolean add(E element) 向链表末尾添加一个新的节点,该节点中的
数据是参数elememt指定的数据。
◆ 当用户需要遍历集合中的对象时,应当使用该集合提供的迭
代器,而不是让集合本身来遍历其中的对象。由于迭代器遍历集 合的方法在找到集合中的一个对象的同时,也得到待遍历的后继 对象的引用,因此迭代器可以快速地遍历集合。
◆链表对象可以使用iterator()方法获取一个Iterator对象,
该对象就是针对当前链表的迭代器。 例题13-3
◆ JDK1.5 之 前 没 有 泛 型 的 LinkedList 类 , 可 以 用 普 通 的
LinkedList创建一个链表对象,如LinkedList mylist=new LinkedList(); Java泛型的主要目的是可以建立具有类型安全的集合框架,优
点就是:在使用这些泛型类建立的数据结构时,不必进行强制类 型转换,即不要求进行运行时类型检查。
2020/8/24
3
§13.1 泛型
泛型(Generics)是在JDK1.5中推出的,其 主要目的是可以建立具有类型安全的集合框架, 如链表、散列映射等数据结构。
2020/8/24
4
§13.1.1 泛型类声明
可以使用“class 名称<泛型列表>”声明一个类,为 了和普通的类有所区别,这样声明的类称作泛型类,如:
2020/8/24
8
§13.2.1 LinkedList<E>泛型类
集合和泛型
![集合和泛型](https://img.taocdn.com/s3/m/75ee19164a7302768e993931.png)
第三章集合和泛型一.集合的框架:集合:也称之为容器,它可以将一系列元素组合成一个单元,用于储存,处理,管理数据。
JDK提供的集合API都包含在Java.util中。
Java集合的框架主要分为俩部分,一个为Collection接口;另一个为Map接口;集合//绿色表示的是主要学习的接口//红色表示的是主要学习的实现类Collection接口主要有三个接口:Set接口,List接口,Queue接口。
Set接口集合的特点:无序的,不可以重复的,不可以根据元素的索引进行访问元素(索引即元素对应的下标)。
List接口集合的特点:有序的,可以重复的,可以根据元素的索引进行访问元素。
二.Set接口Set接口主要有俩个实现类TreeSet和HashSet。
Set接口继承自Collection接口的主要方法:Boolean add (Object obj)返回属性类型添加方法添加元素的类型添加元素的名称(Object代表为所有类型)向集合中添加元素,不能添加相同的元素。
若添加后视为操作无效返回false值。
void clear()移除此集合中的所有的元素,即集合清空。
Boolean contains(Object obj)判断此集合中是否包含该元素,如包含返回值为true。
Boolean isEmpty()判断该集合是否为空,为空返回true。
Iterator itweator()返回一个Iterator对象,可用它遍历集合中的所有元素。
Boolean remove(Object obj)删除此集合包含的元素,并返回true。
Int size()返回集合中元素的个数。
Object[] toArray 但会一个数组,该数组包含集合中的所有元素。
.......HashSet 实现类和TreeSet实现类都实现的是set接口,所以set接口可以使用的方法俩个实现类都可以实现。
TreeSet实现类在实现了set接口的同时,也实现了SortedSet接口,所以TreeSet是一个具有有排序功能的Set接口类。
Java程序设计 项目5Java泛型与集合框架
![Java程序设计 项目5Java泛型与集合框架](https://img.taocdn.com/s3/m/3988a23dcc7931b764ce1518.png)
任务1 泛型
例5.3 泛型接口的应用。
public class MyClassTest{ public static void main(String args[]){ Integer inums[] = {56,47,23,45,85,12,55}; Character chs[] = {'x','w','z','y','b','o','p'}; MyClass<Integer> iob = new MyClass<Integer>(inums); MyClass<Character> cob = new MyClass<Character>(chs); System.out.println("Max value in inums: "+iob.max()); System.out.println("Min value in inums: "+iob.min()); System.out.println("Max value in chs: "+cob.max()); System.out.println("Min value in chs: "+cob.min()); } } 出现运行结果为: Max value in inums: 85 Min value in inums: 12 Max value in chs: z Min value in chs: b
任务1 泛型
接下来我们定义一个类MyClass来实现这个接口,代码如下:
class MyClass<T extends Comparable<T>> implements MinMax<T>{ T[] vals; MyClass(T[] ob){ vals = ob; } public T min(){ T val = vals[0]; for(int i=1; i<vals.length; ++i) if(vals[i].compareTo(val)<0)val=vals[i]; return val; } public T max(){ T val = vals[0]; for(int i=1;i<vals.length;++i) if (vals[i].compareTo(val)>0)val=vals[i]; return val; } }
Java泛型集合与泛型类
![Java泛型集合与泛型类](https://img.taocdn.com/s3/m/555c7165001ca300a6c30c22590102020740f22a.png)
Java泛型集合与泛型类泛型的本质是什么什么是泛型,泛型是⼀种模板技术,就好⽐排序,所有的排序策略,核⼼问题是⽐较和交换,如果⼀种算法对double有效,则只要提供⽐较⼤⼩的规则,该算法也对String甚⾄任意数据类型有效,⽽泛型可以使得这样的排序算法⼀个实现就应⽤到多中情形。
结合这种概念,就有了泛型集合,好⽐ArrayList集合的实现,⽆论对于什么数据类型,其算法结构都是⼀样的,于是从JDK5后有了泛型集合。
泛型有什么好处当然,有了泛型集合和泛型技术后,泛型带来的好处就不只是代码重⽤了,还包括类型安全,以及更好的可读性。
要知道下⾯的代码,在编写代码的时候是不会报错的,要命的是在运⾏的时候就会:1 List list1 = new ArrayList();// ⾮泛型集合2 list1.add("testString");3 list1.add(Integer.valueOf(10));4for (Object s : list1) {5 Integer num = (Integer) s;6// 类型不安全,会抛出异常7 }但是如果是泛型集合,你在编写代码的时候JDK就直接告诉你这⾥不可以这么使⽤了:List<String> list2 = new ArrayList<String>();//list2.add(1);//类型检查,不是允许的类型⽆法放⼊集合这就是所谓的类型安全了。
这是泛型的第⼆个好处。
当然泛型的另外⼀个好处就是增强可读性,取出数据的时候不再有完全没有意义的强制类型转换,因为程序员应该知道这个类型是什么。
泛型的⾮协变性Java中的泛型集合不是协变的,下⾯的代码你觉得可以编译通过吗:List<String> list3 = new ArrayList<String>();List<Object> list4 = list3;看起来没什么问题对吧,⼀个是Object集合,⼀个是String集合,完全兼容啊,事实上是不⾏的,如果⾏的话,泛型集合ArrayList的实例就可以装⼊任何对象了不是吗?这⾥还有个⼩知识:Java的泛型⽀持是编译期技术,所谓的类型擦除就是这个意思,我们后⾯再详细聊。
Java集合框架与泛型
![Java集合框架与泛型](https://img.taocdn.com/s3/m/d2992d7802768e9951e7389a.png)
集合框架1,集合概述为了保存数量不确定的数据,以及保存具有映射关系的数据,Java提供了集合类,集合类主要保存、盛装其它数据(集合里只能保存对象,实际上保存的是对象的引用变量),因此集合类也被称为容器类。
Java的集合类主要由两个接口派生而出:Collection和Map,Collection和Map是Java集合框架的根接口,这两个接口又包含了一些子接口或实现类,所有的集合类都位于java.util包下。
下图是部分集合框架的梗概:2,CollectionCollection接口是List、Set和Queue接口的父接口,该接口里定义了List、Set和Queue 的共性方法,必须要掌握。
2.1,boolean add(Object o):用于向集合中添加元素,如果集合对象被添加操作改变了,则返回true。
2.2,boolean addAll(Collection c):将集合c里的所有元素添加到指定的集合里,如果集合被添加操作改变了,返回true。
2.3,void clear():清除集合里的所有元素。
2.4,bolean contains(Object o):返回集合里是否包含指定元素。
2.5,boolean containsAll(Collection c):返回集合里是否含集合c里的所有元素。
2.6,boolean isEmpty():返回集合是否为空。
当集合长度为0时,返回true;否则返回false。
2.7,Iterator iterator():返回一个Iterator对象,用于遍历集合里的元素。
2.8,boolean remove(Object o):删除集合中指定元素o,当集合中包含了一个或多个元素o 时,全部删除,返回true。
2.9,boolean removeAll(Collection c):从该集合中删除集合c里包含的元素,删除一个或一个以上元素,返回true。
2.10,boolean retainAll(Collection c):从该集合中删除集合c里不包含的元素,取交集,操作改变了该集合,返回true。
集合框架之泛型详解
![集合框架之泛型详解](https://img.taocdn.com/s3/m/7903387e0b1c59eef8c7b449.png)
集合框架之泛型详解泛型(Generics)什么是泛型?泛型是在jdk1.5以后出现的新特性,用于解决安全问题,是一个类型安全机制。
泛型格式:通过<>来定义要操作的引用数据类型。
例如以下的例子:import java.util.*;class GenericsDemo{public static void main(String[] args){ArrayList<String> list=new ArrayList<String>();list.add("zhangsan");list.add("lisi");list.add("huangsan");//list.add(new Integer(3));//会出编译时错误for(Iterator<String> it=list.iterator();it.hasNext();){String s=it.next();System.out.println(s);}}}我们可以看到使用泛型有很多好处。
a)将运行时期出现问题ClassCastException,转移到了编译时期。
方便程序员解决问题。
让运行时期问题减少,安全。
b)避免了强制转换的麻烦。
什么时候使用泛型呢?是在使用java提供的API的一些对象时,只要见到<>就要定义泛型,通常在集合框架中很常见。
<>就是用来接受类型的,当使用集合时,将集合中要存储的数据类型作为参数传递到<>中即可。
自定义泛型自定义泛型类自定义泛型有什么好处呢?自定义泛型最大的好处就是扩展性好。
我们看看如下的例子:class GenericsTool<T>{private T t;public T getObject(){return t;}public void setObject(T t){this.t=t;}}class CustomGenericsDemo{public static void main(String[] args){/*Objcet*/ObjectTool ot=new ObjectTool();ot.setObject(new Student());Student stu=(Student)ot.getObject();/*Generics,T也可以是Student*/GenericsTool<Person> gt=new GenericsTool<Person>();gt.setObject(new Person());Person p=gt.getObject();//不需要强制转换}}我们可以看出自定义泛型的可扩展性高。
java集合泛型
![java集合泛型](https://img.taocdn.com/s3/m/0878a39e6bec0975f465e240.png)
Set
简介
虽然Set同List的实现方式大不一样。List基本上都是以Array为基 础。但是Set则是在HashMap的基础上来实现的,这个就是Set和 List的根本区别。 Set集合中的对象不按特定的方式排序,并且没有重复对象 Iterator it=set.iterator(); while(it.hasNext()) { String oldStr=it.next(); }
泛型代码和虚拟机
虚拟机中没有泛型,只有普通的类和方法。 所有的类型参数都用它们的边界替换。 桥方法被合成为保持多态的。 为保持类型安全性,必要时插入强制类型转换
约束与局限性
不能等同于基本类型
不能用类型参数替换基本类型。 不能实例化泛型类型。但是,可以通过调用Class.newInstance和 Array.newInstance方法,利用反射构造泛型对象和数组。
泛型应用
原始处理
在Java 5之前,为了让类有通用性,往往将参数类型、 返回类型设置为Object类型,当获取这些返回类型来使 用时候,必须将其“强制”转换为原有的类型或者接 口,然后才可以调用对象上的方法 可以使用<T>来声明一个类型持有者名称,然后就可以 把T当作一个类型代表来声明成员、参数和返回值类型 ; 还可以定义泛型接口,泛型方法;
List总结
所有的List中只能容纳单个不同类型的对象组成的表,而 不是Key-Value键值对。例如:[ tom,1,c ]; 所有的List中可以有相同的元素,例如Vector中可以有 [ tom,koo,too,koo ]; 所有的List中可以有null元素,例如[ tom,null,1 ]; 基于Array的List(Vector,ArrayList)适合查询,而 LinkedList(链表)适合添加,删除操作。 就LinkedList.add方法用于将对象添加到列表的尾部,但 是如果希望能够添加到中间位置,则需要使用迭代器。但 只有对有序的集合使用迭代器添加元素才有意义
JAVA实验报告材料-集合框架及泛型机制
![JAVA实验报告材料-集合框架及泛型机制](https://img.taocdn.com/s3/m/83d02a15a417866fb94a8e58.png)
Java语言程序设计C实验报告集合框架及泛型机制学生姓名专业、班级________________________________________ 指导教师 _______________________________________ 成绩_______________________________计算机与信息工程学院年月日一、实验目的学习课程相关章节知识,通过上机练习,掌握以下知识:1.掌握List 接口下ArrayList 及LinkedList 的使用方法。
2.掌握Map 接口下HashMap 及HashTable 的使用方法3.掌握集合中泛型的使用二、实验内容利用集合完成象数据库那样存储数据,并且可以简单查询,利用map 存储学生信息,字段如下:id ,name,age ,实现步骤:(1)创建类,类图如下:2)在main 方法编写逻辑代码3)运行程序并测试结果package ;public class Student {private String name ;private int age ;private String id ;public String getName() {return namepublic void setName(String name ) {this .name = name ;}public int getAge() {return age ;}public void setAge( int age ) {this .age = age ;}public String getId() {return id ;}public void setId(String id) {this .id = id;}public Student(String name , int age , String id ) { super ();this .name = name ;this .age = age ;this .id = id;}public void sayHi(){System. out .println( "name=" + this .getName()+ "age=" + this .getAge()+ " "+ "id=" + this .getId());}//Databace 类package ;import java.util.Collection;import java.util.HashMap;import java.util.Iterator;public class Databace {private Student a;public Databace() {super ();map = new HashMap<String,Student>();}public Student getA() {return a;}public void setA(Student a) {this .a = a;}HashMap<String,Student> map ;public void delete(){ID" );System. out .println( " 请输入要删除表中元素String id =Test. sc.next();if (map .containsKey( id)){map .remove( id);Collection<Student> c= map .values();IteratorvStude nt> it= c.iterator();while (it .hasNext()){a= it .n ext();a.sayHi();}}else{System. out .println("表中没有该元素");}}public void in sert(){System. out .println("按顺序输入id、age、name");String name =Test. sc.next();int age =Test. sc.n ext In t();String id =Test. sc.next();a= new Student( name ,age ,id );map .put( id , a);System. out .println("成功的插入一条记录”);public void update(){System. out .println("请输入要修改表中元素ID");String id =Test. sc.next();if (map .containsKey( id)){map .remove( id);System. out .println("按顺序输入name,age,id");id =Test. sc.next();String name =Test. sc.next();int age =Test. sc.nextInt();a= new Student( id ,age ,name );map .put( id , a);}else{System. out .println("表中没有该元素");}}public void select()System. out .println("请输入要查询的方式 1.查询单行 2.查询全部"); int i=Test. sc.nextInt();switch (i){case 1:{System. out .println("请输入要查询表中元素ID");String id =Test. sc.next();{a= map .get( id);a.sayHi();}else{System. out .println("表中没有该元素");}}break ;case 2:{Collection<Student> c=map .values();Iterator<Student> it= c.iterator();while (it .hasNext()){a= it .next();a.sayHi();}}break ;}}}//testpackage ;import java.util.*;public class Test {/*** @param args */public static Scanner sc= new Scanner(System. public static void main(String[] args ){// TODO Auto-generated method stuint i=0;Databace d = new Databace();while (i==0){int j=Test. sc.nextInt(); switch (j){case 1:d .insert(); breakcase 2: d .select(); breakcase 3: in);System. out .println( System. out .println( System. out .println( System. out .println( System. out .println( "1.储存学生信息") "2.查询学生信息") "3.修改学生信息") "4.删除学生信息") "退出");d .update(); breakcase 4:d .delete(); break default :i=1;}}}}提示:用id 做map 集合的键部分,用student 对象做map 集合的值部分效果显示:三、实验思想四、实验结果五、实验心得。
JAVA集合框架和泛型
![JAVA集合框架和泛型](https://img.taocdn.com/s3/m/36d4198a83d049649b6658d0.png)
串讲:ArrayList与LinkedListList分别在何时使用?
ArrayList
遍历元素和随机访问元 素的效率比较高 插入、删除等操作频繁 时性能低下
LinkedList
插入、删除元素时 效率较高 查找效率较低
第13页/共37页
串讲: Set接口
虚线框表示接口
实线框表示实现类
Java集合框架共有三大类接口: List、Set、Map
第7页/共37页
串讲:List接口
集合框架
List 接口存储一组不唯一,有序(插入顺序)的对象
ArrayList类实现了长度可变的数组,在内存中分配连 续的空间。遍历元素和随机访问元素的效率比较高
LinkedList类采用链表存储方式。插入、删除元素时效 率比较高
第27页/共37页
上机练习
练习
需求说明
使用泛型集合改进查询诗的信息的上机练习,实现对 诗的信息的存储和查询功能。
完成时间:10分钟 共性问题集中讲解
第28页/共37页
讲解:泛型的其他应用-泛型接口
泛型接口就是拥有一个或多个类型参数的接口
语法
public interface 接口名<类型形参> { 方法名(类型形参 类型形参实例); }
第一单元
第一章
集合框架和泛型
第1页/共37页
本门课程目标
学完本门课程后,你能够: 运用Java常用API编写程序 通过Java 程序来操作文件 开发基于多线程的程序 开发Java 服务器/客户端程序并实现通信 定义并解析XML 文件 具有独立分析问题和解决问题的能力,能够胜任 Java 程序的开发
第2页/共37页
本章相关学习资源
Java程序设计课件:泛型与集合
![Java程序设计课件:泛型与集合](https://img.taocdn.com/s3/m/f736c5a90875f46527d3240c844769eae009a3b8.png)
List的常用方法
方法名 add(int index, E element) addAll(int index, Collection<?
extends E> c) get(int index)
indexOf(Object o)
lastIndexOf(Object o)
程序员使用集合框架提供的接口和类,在具体应 用时,不必考虑这些数据结构算法的实现细节, 只需用这些类创建对象并直接应用即可,这大大 提高了编程效率。
2023/12/28
8/35
6.2.1集合框架
核心接口主要有Collection、List、Set、 Queue、Deque和Map。
Collection
方法名 add(E e) clear() equals(Object o) isEmpty() size() iterator() hashCode() toArray() removeAll(Collection<?> c) retainAll(Collection<?> c) contains(Object o) remove(Object o) containsAll(Collection<?> c)
将集合 c中的所有元素添加到当前集合中,添加成功 返回true。
11/35 2023/12/28
Set 接口
Set接口用来描述数据结构中的集合。它具有 与 Collection 完全一样的接口,只是Set 不 保存重复的元素,向Set添加元素时,不保证 元素添加后与添加的顺序一致。实现它的常 用子类有TreeSet类和HashSet类。
remove(int index) set(int index, E element) listIterator()
泛型与集合框架介绍
![泛型与集合框架介绍](https://img.taocdn.com/s3/m/03fc369ab9d528ea81c779d3.png)
7.4 LinkedList<E>泛型类
public
E set(int index,E element)——将当前链表index位
置节点中的对象替换为参数element 指定的对象,并返回被替换的对象。 public int size()——返回链表的 长度,即节点的个数。
7.4 LinkedList<E>泛型类
7.4 LinkedList<E>泛型类
使用LinkedList<E>泛型类可以创建 链表结构的数据对象。链表是由若干个 节点组成的一个种数据结构,每个节点 含有一个数据和下一个节点的引用(单 链表),或含有一个数据以及上一个节 点的引用和下一个节点的引用(双链 表),节点的索引从0开始。链表适合动 态改变它存储的数据,如增加、删除节 点等。
7.4 LinkedList<E>泛型类
3、遍历链表 在例7-7中借助get()方法实现了遍历链 表。我们可以借助泛型类Iterator<E>实 现遍历链表,一个链表对象可以使用 iterator()方法返回一个Iterator<E>类型 的对象,该对象中每个数据成员刚好是 链表节点中的数据,而且这些数据成员 是按顺序存放在Iterator对象中的。
7.4 LinkedList<E>泛型类
public
E removeLast()——删除链 表中最后一个节点,并返回这个节 点中的对象。 public E get(int index)——得到 链表中指定位置处节点中的对象。 public E getFirst()——得到链表 中第一个节点的对象。
什么是链表?
以链式结构存储的线性表称之为线性链