第11章
使用泛型和集合框架
目标
当完成本章后,你应该能够:
?了解集合
?了解并使用List接口
?了解并使用Set接口
?了解并使用Map接口
?了解遗留的集合类
?通过实现Comparable 和Comparator 接口创建自然排序和自定义排序
?使用泛型集合
?了解泛型类中类型参数的使用
?重构已存在的非泛型代码
?编写对集合进行迭代的程序
?了解增强型for 循环
Collection与Map接口
?集合(collection)是个管理一组对象的单一对象。在集合内的对象称之为元素(elements)。通常,集合可以处理很多种类型的对象,这些类型的对象都属于一个特定的类型( 也就是说,它们具有共同的父类型)。
?集合API 包含了如下将对象组为一体的接口:
●Collection ——一组称之为元素的对象;其实现决定了是否有特定的顺序和是否允
许有重复元素。
●List
——有顺序的集合;可允许元素重复●Set
——没有顺序的集合;不允许元素重复
元素的类型
?在Java SE 5.0 发布以前,集合维护对Object 类型的对象的引用。这可以使任何对象存放在集合内。从集合中获取对象后,在使用之前必须先正确使用强制类型转换。但是,到了Java SE 5.0 平台和以后版本,可以使用泛型集合功能指定要存放在集合中的对象类型。避免了获取时做强制类型转换的麻烦。
Map 接口
通用集合实现
列表List
?列表List是一个有顺序的Collection,允许有重复元素,主要实现类包括ArrayList和LinkedList,前者是顺序表,后者是链表。
?程序11-1 的示例中,程序声明了一个被赋予新的ArrayList 对象的List 类型的变量(list)。然后添加一些元素,将list 印到标准输出。因为List 允许有重复元素,程序11-1 的第10 行和第11 行的add 方法返回true。
列表List
1 import java.util.*;
2 public class ArrayListExample {
3 public static void main(String[] args) {
4 List list = new ArrayList();
5 list.add("one");
6 list.add("second");
7 list.add("3rd");
8 list.add(new Integer(4));
9 list.add(new Float(5.0F));
10 list.add("second"); // 重复,被添加
11 list.add(new Integer(4)); // 重复,被添加
12 System.out.println(list);
13 }
14 }
集合Set
?程序11-2 的示例中,程序声明了一个已初始化为new HashSet 的Set 类型的变量(set)。然后添加一些元素,并将set打印到标准输出中。程序11-2的第10 行和第11 行尝试对set添加重复的值。因为重复值无法添加到Set,所以add 方法返回false。
集合Set
1 import java.util.*;
2 public class SetExample {
3 public static void main(String[] args) {
4 Set set = new HashSet();
5 set.add("one");
6 set.add("second");
7 set.add("3rd");
8 set.add(new Integer(4));
9 set.add(new Float(5.0F));
10 set.add("second"); // 重复,不被添加
11 set.add(new Integer(4)); // 重复,不被添加
12 System.out.println(set);
13 }
14 }
映射Map
?Map 有时称之为关联数组。Map 对象描述了键(key) 与值(value) 的映射关系。根据定义,Map对象不允许重复键或空键,一个键最多只能对应一个值。
?Map 接口提供使映射内容被视为集合的三个方法:
entrySet –返回包括所有键值对的集合
keySet –返回映射所有键的集合
values –返回包含映射内所有值的集合
Map
?Map 接口并没有继承Collection 接口,因为它代表了映射,而非对象的集合。SortedMap 接口继承Map 接口。实现Map接口的一些类有HashMap、TreeMap、IdentityHashMap 和WeakHashMap。这些映射集合实现的迭代器所表示的顺序只针对每个特定的迭代器。
映射Map
?程序11-3 的示例中,程序声明了一个Map 类型的变量map,并赋予它新的HashMap对象。然后通过使用put操作添加一些元素。为了证明map 不允许有重复键,程序尝试使用存在的键添加新的值。这将导致以前添加的值被新的值取代。随后程序使用集合查看操作keySet、values 和entrySet 获取map 的内容。
1 import java.util.*;
2 public class MapExample {
3 public static void main(String args[]) {
4 Map map = new HashMap();
5 map.put("one","1st");
6 map.put("second", new Integer(2));
7 map.put("third","3rd");
8 // 重写前面的赋值
9 map.put("third","III");
10 // 返回键的集合
11 Set set1 = map.keySet();
12 // 返回值的集合
13 Collection collection = map.values();
14 // 返回键值映射的集合
15 Set set2 = map.entrySet();
16 System.out.println(set1 + "\n" + collection + ―\n‖ + set2);
17 }
18 }
遗留的集合类
?JDK 1.0和1.1版本的集合类仍然以同样的接口存在于当前的JDK 中,但它们已经被重组以便与新的集合API 交互。
Vector 类实现List 接口。
Stack 类是Vector 的扩展,添加了典型的堆栈操作
Hashtable 类是Map 的实现。
Properties 类是Hashtable 的扩展
?上述的每个集合都有返回枚举对象的elements 方法。Enumeration 同Iterator 接口类似但不兼容。例如hasNext 由枚举接口中的hasMoreElements 替代。
排序集合
?Comparable 和Comparator 接口对于排序集合非常有用。Comparable 接口为实现它的类提供自然排序。Comparator接口用于指定顺序关系。也可以用于覆盖自然排序。这些接口对于集合元素的排序非常有用。
Comparable接口
?Comparable 接口为https://www.doczj.com/doc/214414490.html,ng 包内的成员。当声明类时,JVM 实现无法确定此类对象所需的顺序。通过实现Comparable 接口,可以为任意类的对象提供排序。可以将包含实现Comparable 接口的类的对象排序。实现Comparable 接口的一些Java 类的示例有Byte、Long、String、Date 和Float。其中,number 类使用数字实现;String 类则使用字母实现,Date类使用时间顺序实现。将包含String 类型元素的ArrayList 传递给集合类的静态排序方法,将返回按照字母顺序排序的列表。包含Date 类型元素的列表按时间顺序排序。包含Integer 类型元素的列表按数值大小排序。要编写自定义的Comparable 类型,需要实现Comparable 接口的compareTo 方法。?程序11-4 展示了如何实现Comparable 接口。Student 类实现Comparable 接口以便此类的对象可以互相比较。
运行结果
?StudentList 程序输出结果为:
Name = Kelly Grant ID = 0 GPA = 2.3
Name = John Lynn ID = 0 GPA = 2.8
Name = Jim Max ID = 0 GPA = 3.6
Name = Mike Hauffmamn ID = 0 GPA = 4.0
?由观察得到学生是依照GPA 进行比较的。这是因为当在TreeSet 集合中排序时,TreeSet查看对象是否有自然顺序,并且在这种情况下,使用compareTo 方法比较对象。
Comparator接口
?有些集合,例如TreeSet 是被排序的。TreeSet 实现需要知道如何将元素排序。假如元素已经有自然排序,TreeSet 使用自然排序。否则,必须协助排序。例如,TreeSet 类有将Comparator 接收为参数的以下构造器:
TreeSet(Comparator comparator)
?此构造器会创建一个新的空树集合,依照指定的Comparator 来排序。下面将会进一步讨论Comparator 接口的使用。
《集合框架及泛型》作业 一、根据课上讲解内容,完成演示示例和课堂练习 1、ArrayList获取并打印新闻标题 需求说明:按照以下实现的步骤,使用ArrayList获取和打印新闻标题,显示效果如下图所示: (1)创建多个各类新闻标题对象,包含ID、名称和创建者三个属性; (2)创建存储各类新闻标题的集合对象; (3)按照顺序依次添加各类新闻标题,使用add()方法; (4)获取新闻标题的总数,使用size()方法; (5)根据位置获取相应新闻标题、逐条打印每条新闻标题的名称,使用for 循环遍历。 2、ArrayList存储狗狗信息 需求说明:按照以下实现的步骤,使用ArrayList存储狗狗信息,使用ArrayList的方法对狗狗信息进行删除、读取和判断,显示效果如下图所示:(1)存储多条狗信息,获取狗总数,逐条打印出各条狗信息; (2)删除指定位置的狗,使用remove()方法; (3)判断集合中是否包含指定狗,使用contains()方法;
3、LinkedList添加和删除新闻标题 需求说明:在作业1的基础上,换用LinkedList存储新闻数据,并且使用LinkedList的getFirst()和getLast()方法获取第一条和最后一条数据,以及removeFirst()和removeLast()方法删除第一条和最后一条数据,输出效果如下图所示。 4、集合头尾位置删除和条件狗信息 需求说明:按照作业3的实现方式和所用到LinkedList的方法,实现狗狗信
息的更新并输出,输出效果如图所示。 5、使用Iterator和增强型for循环遍历Set 需求说明:按照以下实现的步骤,使用Iterator和增强型for循环遍历Set,输出效果如下图所示: (1)创建多个各类新闻标题对象,包含ID、名称和创建者三个属性; (2)创建存储各类新闻标题的集合对象; (3)按照顺序依次添加各类新闻标题; (4)获取新闻标题的总数; (5)使用iterator()获取Iterator对象; (6)使用Iterator遍历集合,使用hasNext()方法作为循环条件,判断是否存在另一个可访问的元素; (7)使用增强型for遍历集合;
实验十泛型与集合框架 1.实验目的 1、掌握LinkedList
Java 语言程序设计 C 实验报告 集合框架及泛型机制 学生姓名 专业、班级 指导教师 成绩 计算机与信息工程学院 年月日
一、实验目的 学习课程相关章节知识,通过上机练习,掌握以下知识: 1.掌握 List 接口下 ArrayList 及 LinkedList 的使用方法。 2.掌握 Map 接口下 HashMap 及 HashTable的使用方法 3.掌握集合中泛型的使用 二、实验内容 利用集合完成象数据库那样存储数据,并且可以简单查询,利用 map 存储学生信息,字段如下: id ,name,age,实现步骤: (1)创建类,类图如下: (2)在 main 方法编写逻辑代码 (3)运行程序并测试结果 package https://www.doczj.com/doc/214414490.html,; public class Student { private String name ; private int age ; private String id ;
public String getName() { return name ; } public 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()); } }
Java语言程序设计C 实验报告 集合框架及泛型机制 学生姓名 专业、班级 指导教师 成绩 计算机与信息工程学院 年月日 一、实验目的 学习课程相关章节知识,通过上机练习,掌握以下知识:
1.掌握List接口下ArrayList及LinkedList的使用方法。 2.掌握Map接口下HashMap 及HashTable的使用方法 3.掌握集合中泛型的使用 二、实验内容 利用集合完成象数据库那样存储数据,并且可以简单查询,利用map存储学生信息,字段如下: id ,name,age,实现步骤: (1)创建类,类图如下: (2)在main方法编写逻辑代码 (3)运行程序并测试结果 package com、cn; public class Student { private String name; private int age; private String id; public String getName() { return name; } public 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 com、cn; import java、util、Collection; import java、util、HashMap; import java、util、Iterator; public class Databace { private Student a; public Databace() { super(); map=new HashMap
任务一:用LinkedList存放对象 1.利用面向对象的思想,创建以下类: ●Person类,包含Person的姓名和身份证号码,覆盖Object类的toString() 方法,显示“姓名:XXX 身份证号:XXX”。 ●Student类,继承Person类,包含学生的语文、数学、英文课的成绩,并覆盖 父类的toString()方法,显示“姓名:XXX 身份证号:XXX 语文:XXX 数学:XXX 英文:XXX”。 ●Teacher类,继承Person类,包含教师的工资。并覆盖父类的toString()方 法,显示“姓名:XXX 身份证号:XXX 工资:XXX”。 ●public class Person implements Comparable{ ●String name; ●String ID; ●Person(String s,String i){ ●name=s; ●ID=i; } ●public String toString() { ●String str="姓名:"+name+" 身份证号码:"+ID; ●return str; } ●public int compareTo(Object arg0) { ●Person p=(Person)arg0; ●return https://www.doczj.com/doc/214414490.html,pareTo(p.ID); } } ●class Student extends Person { ●int Chinese; ●int Math; ●int English; ●Student(String n,String i,int c,int m,int e){ ●super(n,i); ●Chinese=c; ●Math=m; ●English=e; } ●public String toString() { ●String str; ●str=" 语文成绩:"+Chinese+" 数学成绩:"+Math+" 英语成绩: "+English; ●return super.toString()+str; ●} ●} ●class Teacher extends Person{ ●int salary; ●Teacher(String n,String i,int s){ ●super(n,i); ●salary=s; ●}
浙江大学城市学院实验报告 课程名称面向对象程序设计 实验项目名称集合框架与泛型 学生姓名专业班级学号 一. 实验目的和要求 1. 了解Java集合框架的接口和实现类 2. 理解泛型类、泛型接口、泛型方法的特点 3. 掌握List
泛型与集合框架 1.实验目的 1、掌握LinkedList
java 集合框架(习题) 集合框架 Key Point * Collection 接口、Set 接口、List 接口基本操作 * List 接口及其实现类 * Set 接口及其实现类 * 迭代遍历 * Hash 算法与hashCode 方法 * Comparable 接口 * Map 接口及其实现类 * 遍历Map * 泛型 练习 1. 填空 Collection 接口的特点是元素是对象; List 接口的特点是元素有(有|无)顺序,可以(可以|不可以)重复; Set 接口的特点是元素无(有|无)顺序,不可以(可以|不可以)重复;Map 接口的特点是元素是键值对,其中值可以重复,键不可以重复。 2. (List)有如下代码 import java.util.*; public class TestList{ public static void main(String args[]){ List list = new ArrayList(); list.add(“Hello”); list.add(“World”); list.add(1, “Learn”); list.add(1, “Java”); printList(list); } public static void printList(List list){ for(Object obj:list){ String str=(String)obj; System.out.println(obj); } } } 要求: 1) 把//1 处的代码补充完整,要求输出list 中所有元素的内容 2) 写出程序执行的结果Hello java Learn World 3) 如果要把实现类由ArrayList 换为LinkedList,应该改哪里?ArrayList 和LinkedList 使用上有什么区别?实现上有什么区别?
实验13 集合框架与泛型 一、实验目的和要求 1. 了解Java集合框架的接口和实现类 2. 理解泛型类、泛型接口、泛型方法的特点 3. 掌握List