泛型与集合框架
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
▪ interface Listen<E> { ▪ void listen(E x); ▪} ▪ 注:普通类实现泛型接口时,必须指定泛型接口
中泛型列表中的具体类型
.
例12-2
▪ interface Listen<E> {
▪
void listen(E x);
▪}
▪ class Student implements Listen<Piano> {
向这个链表依次添加节点。由于任何类都是 Object类的子类,因此可以把任何一个对象作为 链表节点中的对象
.
使用集合框架注意事项(没有使用泛型)
任何对象加入集合类后,自动转变为Object类型;取出 时,需要进行强制类型转换,恢复为特定的类型
Rabbit
Car
Student
加入集合
从集合中取出
Object
例12-3
▪ List<String> list=new LinkedList<String>();
▪ list.add("大家好");
▪ list.add("国庆60周年");
▪ list.add("十一快乐");
▪ Iterator<String> iter=list.iterator();
▪ while(iter.hasNext()){
.
12.2.3 遍历链表
▪ 当用户需要遍历集合中的对象时,应当使用该集 合提供的迭代器,而不是让集合本身来遍历其中 的对象。由于迭代器遍历集合的方法在找到集合 中的一个对象的同时,也得到待遍历的后继对象 的引用,因此迭代器可以快速地遍历集合。
.
什么是迭代器
▪ 迭代器是一个实现了Iterator接口的类的对象 ▪ 所有实现了Collection接口的类都有一个名称为
.
集合框架的层次结构
.
说明
▪ Collection是集合接口,集合框架的根,代表一组 Object
▪ Set子接口:里面的元素不允许重复 ▪ List子接口:里面的元素可以重复
.
说明
▪ Set和List对比: ▪ Set:检索元素效率低下,删除和插入效率高。 ▪ 插入和删除不会引起元素位置改变 ▪ List:和数组类似,List可以动态增长,查找元
▪
String te=iter.next();
▪
System.out.print(te+" ");
▪}
▪ System.out.println("");
▪ long endTime=System.currentTimeMillis();
▪ for(int i=0;i<list.size();i++){
Object
(Rabbit) object (Car) object
Object (Student) object
Rabbit
Ca. r
Student
例12-4
▪ 使用了JDK1.5版本之前的LinkedList
.
12.2.4 排序与查找
▪ 如果链表中的数据是实现了Comparable接口的 类的实例,比如String对象,那么Java.util包中 的Collections类调用sort(List<E> list)方法可 以对参数指定的列表进行排序,即按节点中的存 储的对象的大小升序排列节点。
▪
}
.
▪}
Java集合框架
▪ 在Java语言中,设计者对常用的数据结构和算 法做了一些规范(接口)和实现(具体实现接口 的类)。
▪ 所有抽象出来的数据结构和算法统称为Java集 合框架
▪ Java程序员在具体应用时,不必考虑数据结构 和算法实现细节,只需要用这些类创建出来的一 些对象,然后直接应用就可以了,提高了编程效 率
型 ▪ 泛型类的类体和和普通类的类体完全类似,由成
员变量和方法构成
.
举例
▪ public class ShowObject<E>{
▪
public showMess(E b){
▪
String mess=b.toString();
▪
System.out.println(mess);
▪
}Leabharlann ▪}.12.1.2 泛型类声明对象
▪ 以下是LinkedList<E>泛型类本身新增加的一些 常用方法
▪ public void addFirst(E element) ▪ public void addLast(E element) ▪ public E getFirst() ▪ public E getLast() ▪ public E removeFirst() ▪ public E removeLast() ▪ public Object clone()
▪
System.out.println("钢琴协奏曲:黄河");
▪
}
▪}
▪ class Violin {
▪
public void play() {
▪
System.out.println("小提琴协奏曲:梁祝");
▪
}
▪}
▪ public class Example12_2 {
▪
public static void main(String args[ ]) {
.
12.2.2 常用方法
▪ 以下是LinkedList<E>泛型类实现Lis<E>泛型接口中 的一些常用方法。
▪ public boolean add(E element) ▪ public void add(int index ,E element) ▪ public void clear() ▪ public E remove(int index) ▪ public boolean remove(E element) ▪ public E get(int index) ▪ public int indexOf(E element) ▪ public int lastIndexOf(E element) ▪ public E set(int index ,E element) ▪ public int size() ▪ public boolean contains. (Object element)
.
▪ public class Example12_1 { ▪ public static void main(String args[ ]) { ▪ ShowObject<Dog> showDog = new
ShowObject<Dog>(); ▪ showDog.showMess(new Dog()); ▪ ShowObject<Cat> showCat = new
▪ JDK1.5是支持泛型的编译器,它将运行时的类 型检查提前到编译时执行,使代码更安全。
.
12.1.1 泛型类
▪ 可以使用“class 名称<泛型列表>”声明一个类, 为了和普通的类有所区别,这样声明的类称作泛 型类,如:
▪ class ShowObject<E> ▪ E是其中的泛型,也就是并没有指定E是何种类
第12章泛型与集合框架
.
12.1 泛型
▪ 泛型(Generics)是在JDK1.5中推出的,其主 要目的是可以建立具有类型安全的集合框架,如 链表、散列映射等数据结构
.
泛型的目的
▪ Java泛型的主要目的是可以建立具有类型安全 的数据结构,如链表、散列表等数据结构,最重 要的一个优点就是:在使用这些泛型类建立的数 据结构时,不必进行强制类型转换,即不要求进 行运行时类型检查。
iterator()的方法来获取迭代器 ▪ 链表对象可以使用iterator()方法获取一个
Iterator对象,该对象就是针对当前链表的迭代 器 ▪ next方法:返回迭代器中的一个元素 ▪ hasNext方法:如果容器里还有元素,则为true
.
▪ import java.util.*; ▪ public class Example12_3 { ▪ public static void main(String args[ ]){
.
Java 容器类
▪ 容器类可以大大提高编程效率和编程能力 ▪ Java2容器类类库的用途是“保存对象”,它分
为两类: ▪ Collection----一组独立的元素,通常这些元素都
服从某种规则。List必须保持元素特定的顺序, 而Set不能有重复元素。 ▪ Map----一组成对的“键值对”对象,即其元素 是成对的对象
▪
String te=list.get(i);
▪
System.out.print(te+" ");
▪ }}}
.
▪ JDK1.5之前没有泛型的LinkedList类,可以用 普通的LinkedList创建一个链表对象,如
▪ LinkedList mylist=new LinkedList(); ▪ 然后mylist链表可以使用add(Object obj)方法
▪ 和普通的类相比,泛型类声明和创建对象时,类 名后多了一对“<>”,而且必须要用具体的类型 替换“<>”中的泛型。
.
▪ Dog.java ▪ public class Dog { ▪ public String toString() { ▪ return ▪} ▪} ▪ Cat.java ▪ public class Cat { ▪ public String toString() { ▪ return "一只小花猫"; ▪} ▪}
▪
public void listen(Piano p) {
▪
p.play();
▪
}
▪}
▪ class Teacher implements Listen<Violin> {
▪
public void listen(Violin v) {
▪
v.play();
▪
}
▪}
▪ class Piano {
▪
public void play() {
▪ LinkedList<String> list = new LinkedList<String>();
▪ 创建一个空双链表。 ▪ 使用LinkedList<E>泛型类声明创建链表时,必
须要指定E的具体类型,然后链表就可以使用 add(E obj)方法向链表依次增加节点
.
举例
▪ list.add(“你好”); ▪ list.add(“十一快乐”); ▪ list.add(“注意休息”); ▪ 此时,链表里有3个节点,节点自动链接在一起
素效率高。
.
说明
▪ Set的子类:
▪ HashSet ▪ 以哈希表的形式存放元素,插入删除速度很快
▪ TreeSet ▪ 保持次序的Set,底层为树结构。使用它可以从
Set中提取有序的序列。 ▪ List的子类: ▪ ArrayList:动态数组(顺序结构) ▪ LinkedList:链表(链式结构)
ShowObject<Cat>(); ▪ showCat.showMess(new Cat()); ▪} ▪}
.
说明
▪ 泛型类中的泛型变量只能调用Object类中的方法, 因此Cat和Dog类都重写了Object类的toString() 方法。
.
12.1.3 泛型接口
▪ 可以使用“interface 名称<泛型列表>”声明一个 接口,这样声名的接口称作泛型接口如
.
12.2 链表
▪ 链表是由若干个称作节点的对象组成的一种数据
结构,每个节点含有一个数据和下一个节点的引
用,或含有一个数据并含有上一个节点的引用和
下一个节点的引用
数据
数据
数据
数据
null
引用
引用
引用
引用
引用
引用
null
图12.3 双链表示意图
.
12.2.1 LinkedList<E>泛型类
▪ java.util包中的LinkedList<E>泛型类创建的对 象以链表结构存储数据,习惯上称LinkedList类 创建的对象为链表对象。例如,
▪
Student zhang=new Student();
▪
System.out.println("学生听:");
▪
zhang.listen(new Piano());
▪
Teacher teacher=new Teacher();
▪
System.out.println("老师听:");
▪
teacher.listen(new Violin());
.
Collections类
▪ 注意区分和Collection接口的的区别 ▪ Collections是一个类,该类里的 方法都是静态
的方法,主要是用来对集合的操作的。 ▪ 是个非常有用的类
.
▪ String类实现了泛型接口Comparable<E>中的 compareTo(E b)方法,使得字符串可以按字典 序比较大小,如果一个链表list如下添加节点:
中泛型列表中的具体类型
.
例12-2
▪ interface Listen<E> {
▪
void listen(E x);
▪}
▪ class Student implements Listen<Piano> {
向这个链表依次添加节点。由于任何类都是 Object类的子类,因此可以把任何一个对象作为 链表节点中的对象
.
使用集合框架注意事项(没有使用泛型)
任何对象加入集合类后,自动转变为Object类型;取出 时,需要进行强制类型转换,恢复为特定的类型
Rabbit
Car
Student
加入集合
从集合中取出
Object
例12-3
▪ List<String> list=new LinkedList<String>();
▪ list.add("大家好");
▪ list.add("国庆60周年");
▪ list.add("十一快乐");
▪ Iterator<String> iter=list.iterator();
▪ while(iter.hasNext()){
.
12.2.3 遍历链表
▪ 当用户需要遍历集合中的对象时,应当使用该集 合提供的迭代器,而不是让集合本身来遍历其中 的对象。由于迭代器遍历集合的方法在找到集合 中的一个对象的同时,也得到待遍历的后继对象 的引用,因此迭代器可以快速地遍历集合。
.
什么是迭代器
▪ 迭代器是一个实现了Iterator接口的类的对象 ▪ 所有实现了Collection接口的类都有一个名称为
.
集合框架的层次结构
.
说明
▪ Collection是集合接口,集合框架的根,代表一组 Object
▪ Set子接口:里面的元素不允许重复 ▪ List子接口:里面的元素可以重复
.
说明
▪ Set和List对比: ▪ Set:检索元素效率低下,删除和插入效率高。 ▪ 插入和删除不会引起元素位置改变 ▪ List:和数组类似,List可以动态增长,查找元
▪
String te=iter.next();
▪
System.out.print(te+" ");
▪}
▪ System.out.println("");
▪ long endTime=System.currentTimeMillis();
▪ for(int i=0;i<list.size();i++){
Object
(Rabbit) object (Car) object
Object (Student) object
Rabbit
Ca. r
Student
例12-4
▪ 使用了JDK1.5版本之前的LinkedList
.
12.2.4 排序与查找
▪ 如果链表中的数据是实现了Comparable接口的 类的实例,比如String对象,那么Java.util包中 的Collections类调用sort(List<E> list)方法可 以对参数指定的列表进行排序,即按节点中的存 储的对象的大小升序排列节点。
▪
}
.
▪}
Java集合框架
▪ 在Java语言中,设计者对常用的数据结构和算 法做了一些规范(接口)和实现(具体实现接口 的类)。
▪ 所有抽象出来的数据结构和算法统称为Java集 合框架
▪ Java程序员在具体应用时,不必考虑数据结构 和算法实现细节,只需要用这些类创建出来的一 些对象,然后直接应用就可以了,提高了编程效 率
型 ▪ 泛型类的类体和和普通类的类体完全类似,由成
员变量和方法构成
.
举例
▪ public class ShowObject<E>{
▪
public showMess(E b){
▪
String mess=b.toString();
▪
System.out.println(mess);
▪
}Leabharlann ▪}.12.1.2 泛型类声明对象
▪ 以下是LinkedList<E>泛型类本身新增加的一些 常用方法
▪ public void addFirst(E element) ▪ public void addLast(E element) ▪ public E getFirst() ▪ public E getLast() ▪ public E removeFirst() ▪ public E removeLast() ▪ public Object clone()
▪
System.out.println("钢琴协奏曲:黄河");
▪
}
▪}
▪ class Violin {
▪
public void play() {
▪
System.out.println("小提琴协奏曲:梁祝");
▪
}
▪}
▪ public class Example12_2 {
▪
public static void main(String args[ ]) {
.
12.2.2 常用方法
▪ 以下是LinkedList<E>泛型类实现Lis<E>泛型接口中 的一些常用方法。
▪ public boolean add(E element) ▪ public void add(int index ,E element) ▪ public void clear() ▪ public E remove(int index) ▪ public boolean remove(E element) ▪ public E get(int index) ▪ public int indexOf(E element) ▪ public int lastIndexOf(E element) ▪ public E set(int index ,E element) ▪ public int size() ▪ public boolean contains. (Object element)
.
▪ public class Example12_1 { ▪ public static void main(String args[ ]) { ▪ ShowObject<Dog> showDog = new
ShowObject<Dog>(); ▪ showDog.showMess(new Dog()); ▪ ShowObject<Cat> showCat = new
▪ JDK1.5是支持泛型的编译器,它将运行时的类 型检查提前到编译时执行,使代码更安全。
.
12.1.1 泛型类
▪ 可以使用“class 名称<泛型列表>”声明一个类, 为了和普通的类有所区别,这样声明的类称作泛 型类,如:
▪ class ShowObject<E> ▪ E是其中的泛型,也就是并没有指定E是何种类
第12章泛型与集合框架
.
12.1 泛型
▪ 泛型(Generics)是在JDK1.5中推出的,其主 要目的是可以建立具有类型安全的集合框架,如 链表、散列映射等数据结构
.
泛型的目的
▪ Java泛型的主要目的是可以建立具有类型安全 的数据结构,如链表、散列表等数据结构,最重 要的一个优点就是:在使用这些泛型类建立的数 据结构时,不必进行强制类型转换,即不要求进 行运行时类型检查。
iterator()的方法来获取迭代器 ▪ 链表对象可以使用iterator()方法获取一个
Iterator对象,该对象就是针对当前链表的迭代 器 ▪ next方法:返回迭代器中的一个元素 ▪ hasNext方法:如果容器里还有元素,则为true
.
▪ import java.util.*; ▪ public class Example12_3 { ▪ public static void main(String args[ ]){
.
Java 容器类
▪ 容器类可以大大提高编程效率和编程能力 ▪ Java2容器类类库的用途是“保存对象”,它分
为两类: ▪ Collection----一组独立的元素,通常这些元素都
服从某种规则。List必须保持元素特定的顺序, 而Set不能有重复元素。 ▪ Map----一组成对的“键值对”对象,即其元素 是成对的对象
▪
String te=list.get(i);
▪
System.out.print(te+" ");
▪ }}}
.
▪ JDK1.5之前没有泛型的LinkedList类,可以用 普通的LinkedList创建一个链表对象,如
▪ LinkedList mylist=new LinkedList(); ▪ 然后mylist链表可以使用add(Object obj)方法
▪ 和普通的类相比,泛型类声明和创建对象时,类 名后多了一对“<>”,而且必须要用具体的类型 替换“<>”中的泛型。
.
▪ Dog.java ▪ public class Dog { ▪ public String toString() { ▪ return ▪} ▪} ▪ Cat.java ▪ public class Cat { ▪ public String toString() { ▪ return "一只小花猫"; ▪} ▪}
▪
public void listen(Piano p) {
▪
p.play();
▪
}
▪}
▪ class Teacher implements Listen<Violin> {
▪
public void listen(Violin v) {
▪
v.play();
▪
}
▪}
▪ class Piano {
▪
public void play() {
▪ LinkedList<String> list = new LinkedList<String>();
▪ 创建一个空双链表。 ▪ 使用LinkedList<E>泛型类声明创建链表时,必
须要指定E的具体类型,然后链表就可以使用 add(E obj)方法向链表依次增加节点
.
举例
▪ list.add(“你好”); ▪ list.add(“十一快乐”); ▪ list.add(“注意休息”); ▪ 此时,链表里有3个节点,节点自动链接在一起
素效率高。
.
说明
▪ Set的子类:
▪ HashSet ▪ 以哈希表的形式存放元素,插入删除速度很快
▪ TreeSet ▪ 保持次序的Set,底层为树结构。使用它可以从
Set中提取有序的序列。 ▪ List的子类: ▪ ArrayList:动态数组(顺序结构) ▪ LinkedList:链表(链式结构)
ShowObject<Cat>(); ▪ showCat.showMess(new Cat()); ▪} ▪}
.
说明
▪ 泛型类中的泛型变量只能调用Object类中的方法, 因此Cat和Dog类都重写了Object类的toString() 方法。
.
12.1.3 泛型接口
▪ 可以使用“interface 名称<泛型列表>”声明一个 接口,这样声名的接口称作泛型接口如
.
12.2 链表
▪ 链表是由若干个称作节点的对象组成的一种数据
结构,每个节点含有一个数据和下一个节点的引
用,或含有一个数据并含有上一个节点的引用和
下一个节点的引用
数据
数据
数据
数据
null
引用
引用
引用
引用
引用
引用
null
图12.3 双链表示意图
.
12.2.1 LinkedList<E>泛型类
▪ java.util包中的LinkedList<E>泛型类创建的对 象以链表结构存储数据,习惯上称LinkedList类 创建的对象为链表对象。例如,
▪
Student zhang=new Student();
▪
System.out.println("学生听:");
▪
zhang.listen(new Piano());
▪
Teacher teacher=new Teacher();
▪
System.out.println("老师听:");
▪
teacher.listen(new Violin());
.
Collections类
▪ 注意区分和Collection接口的的区别 ▪ Collections是一个类,该类里的 方法都是静态
的方法,主要是用来对集合的操作的。 ▪ 是个非常有用的类
.
▪ String类实现了泛型接口Comparable<E>中的 compareTo(E b)方法,使得字符串可以按字典 序比较大小,如果一个链表list如下添加节点: