第7章 集合教学设计.docx
《第7章 集合教学设计.docx》由会员分享,可在线阅读,更多相关《第7章 集合教学设计.docx(17页珍藏版)》请在冰豆网上搜索。
![第7章 集合教学设计.docx](https://file1.bdocx.com/fileroot1/2022-12/6/ffcc7969-e8f0-411c-bd00-a4b8c8829f6e/ffcc7969-e8f0-411c-bd00-a4b8c8829f6e1.gif)
第7章集合教学设计
传智播客
《Java基础入门》
教学设计
课程名称:
Java基础入门
授课年级:
2014年级
授课学期:
2014学年第一学期
教师姓名:
某某老师
2014年02月09日
课题名称
第7章集合
计划学时
6课时
内容分析
Java中的集合类就像一个容器,专门用来存储Java类的对象。
章将针对Java中的集合类进行详细地讲解,并结合程序案例来学习几种集合类的用法以及如何用Collections和Arrays工具类操作集合。
教学目标及基本要求
要求学生了解集合的定义和分类,掌握List接口、Set接口、Map接口的实现类,掌握使用Collections工具类和Arrays工具类操作集合。
重点及措施
教学重点:
List、Set、Map三个接口中的实现类,泛型、Collections工具类和Arrays工具类
难点及措施
教学难点:
泛型、Collections工具类、Arrays工具类
教学方式
教学采用教师课堂讲授为主,使用教学PPT讲解
教
学
过
程
第一课时
(集合概述、Collection接口、list接口、ArrayList集合、
LinkedList集合)
集合概述
为了保存一些数目不确定的对象,JDK中提供了一系列特殊的类,这些类可以存储任意类型的对象,并且长度可变,统称为集合。
这些类都位于java.util包中。
集合类的继承体系如图所示。
Collection接口
Collection是所有单列集合的父接口,因此在Collection中定义了单列集合(List和Set)通用的一些方法,具体如下:
方法声明
功能描述
booleanadd(Objecto)
向集合中添加一个元素
booleanaddAll(Collectionc)
将指定Collection中的所有元素添加到该集合中
voidclear()
删除该集合中的所有元素
booleanremove(Objecto)
删除该集合中指定的元素
booleanremoveAll(Collectionc)
删除指定集合中的所有元素
booleanisEmpty()
判断该集合是否为空
booleancontains(Objecto)
判断该集合中是否包含某个元素
booleancontainsAll(Collectionc)
判断该集合中是否含指定集合的所有元素
Iteratoritera
or()
返回在该集合的元素上进行迭代的迭代器(Iterator),用于遍历该集合所有元素
intsize()
获取该集合元素个数
List集合
List接口继承自Collection接口,是单列集合的一个重要分支。
在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的。
另外,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。
List接口中的常用方法如下表所示。
方法声明
功能描述
voidadd(intindex,Objectelement
将元素element插入在List集合的index处
booleanaddAll(intindex,Collectionc)
将集合c所包含的所有元素插入到List集合的index处
Objectget(intindex)
返回集合索引index处的元素
Objectremove(int index)
删除index索引处的元素
Objectset(int index,
Object element)
将索引index处元素替换成element对象,并将替换后的元素返回
intindexOf(Object o)
返回对象o在List集合中出现的位置索引
intlastIndexOf(Object o)
返回对象o在List集合中最后一次出现的位置索引
ListsubList(int fromIndex,
int toIndex)
返回从索引fromIndex(包括)到toIndex(不包括)处所有元素集合组成的子集合
ArrayList集合
ArrayList是List接口的一个实现类。
在ArrayList内部封装了一个长度可变的数组对象,可以将ArrayList集合看作一个长度可变的数组。
LinkedList集合
LinkedList集合是List接口的另一个实现类。
LinkedList集合对于元素的增删操作具有很高的效率,因为该类内部维护了一个双向循环链表,链表中的每一个元素都使用引用的方式来记住它的前一个元素和后一个元素。
当插入或删除一个元素时,只需要修改元素之间的这种引用关系即可。
双向链表结构图如下:
第二课时
(Iterator接口、foreach循环、ListIterator接口、Enumeration接口)
Iterator接口
在程序开发中,经常需要遍历集合中的所有元素。
针对这种需求,JDK专门提供了一个接口Iterator。
通过一个案例来学习如何使用Iterator迭代集合中的元素,具体代码如下所示:
importjava.util.*;
publicclassExample03{
publicstaticvoidmain(String[]args){
ArrayListlist=newArrayList();//创建ArrayList集合
list.add("data_1");//向该集合中添加字符串
list.add("data_2");
list.add("data_3");
list.add("data_4");
Iteratorit=list.iterator();//获取Iterator对象
while(it.hasNext()){
Objectobj=it.next();
System.out.println(obj);
}
}
}
下图演示了Iterator对象迭代元素的过程:
foreach循环
foreach循环用于遍历数组或集合中的元素,其具体语法格式如下:
for(容器中元素类型临时变量:
容器变量){
执行语句
}
通过一个案例演示foreach循环,具体代码如下所示:
importjava.util.ArrayList;
publicclassExample04{
publicstaticvoidmain(String[]args){
//创建ArrayList集合
ArrayListlist=newArrayList();
list.add("Jack");
list.add("Rose");
list.add("Tom");
for(Objectobj:
list){
System.out.println(obj);
}
}
}
foreach循环虽然书写起来很简洁,但在使用时也存在一定的局限性。
当使用foreach循环遍历集合和数组时,只能访问集合中的元素,不能对其中的元素进行修改。
ListIterator接口
ListIterator中提供了hasPrevious()方法和previous()方法,通过这两个方法可以实现反向迭代元素,另外还提供了add()方法用于增加元素,接下来通过一个案例来学习ListIterator迭代器的使用:
importjava.util.*;
publicclassExample07{
publicstaticvoidmain(String[]args){
ArrayListlist=newArrayList();
list.add("data_1");
list.add("data_2");
list.add("data_3");
System.out.println(list);
ListIteratorit=list.listIterator(list.size());while(it.hasPrevious()){
Objectobj=it.previous();
System.out.print(obj+"");
}
}
}
Enumeration接口
✧Vector集合
Vevtor集合是List接口的一个实现类,用法与ArrayList完全相同,区别在于Vector集合是线程安全的,而ArrayList集合是线程不安全的。
在Vector类中提供了一个elements()方法用于返回Enumeration对象,通过Enumeration对象就可以遍历该集合中的元素。
下面的案例演示了如何使用Enumeration对象遍历Vector集合,具体如下:
importjava.util.*;
publicclassExample08{
publicstaticvoidmain(String[]args){
Vectorv=newVector();
v.add("Jack");
v.add("Rose");
v.add("Tom");
Enumerationen=v.elements();
while(en.hasMoreElements()){
Objectobj=en.nextElement();
System.out.println(obj);
}
}
}
第三课时
(Set接口简介、HashSet集合、TreeSet集合、Map接口和HashMap集合)
Set接口简介
Set接口继承自Collection接口,它与Collection接口中的方法基本一致,只是比Collection接口更加严格。
Set接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。
Set接口主要有两个实现类,分别是HashSet和TreeSet。
HashSet集合
HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,并且
元素都是无序的。
HashSet集合存储元素的过程如下图所示。
TreeSet集合
TreeSet是Set接口的另一个实现类,它内部采用平衡二叉树来存储元素,这样的结构可以保证TreeSet集合中没有重复的元素,并且可以对元素进行排序。
二叉树中元素的存储结构如下图所示。
上图所示的二叉树中,同一层的元素,左边的元素总是小于右边的元素。
注意:
集合中的元素在进行比较时,都会调用compareTo()方法,该方法是Comparable接口中定义的,因此要想对集合中的元素进行排序,就必须实现Comparable接口。
Map接口
Map接口是一种双列集合,它的每个元素都包含一个键对象Key和值对象
Value,键和值对象之间存在一种对应关系,称为映射。
从Map集合中访问元素时,只要指定了Key,就能找到对应的Value。
Map接口中定义的一些通用方法如下表所示。
方法声明
功能描述
voidput(Keyk,Valuev)
将指定的值与此映射中的指定键关联(可选操作)
Objectget(Objectkey)
返回指定键所映射的值;如果此映射不包含该键的映射关系,则返回null
booleancontainsKey(Objectkey)
如果此映射包含指定键的映射关系,则返回true。
booleancontainsValue(Objectvalue)
如果此映射将一个或多个键映射到指定值,则返回true
SetkeySet()
返回此映射中包含的键的Set视图
Collectionvalues()
返回此映射中包含的值的Collection视图
HashMap集合
HashMap集合是Map接口的一个实现类,它用于存储键值映射关系,但
必须保证不出现重复的键。
如果存储了相同的键,后存储的值会覆盖原有的值。
LinkedHashMap类是HashMap的子类,和LinkedList一样也使用双向链表
来维护内部元素的关系,使Map元素迭代的顺序与存入的顺序一致。
第四课时
(TreeMap集合、Properties集合、泛型、Collections工具类、Arrays工具类)
TreeMap集合
TreeMap集合是用来存储键值映射关系的,其中不允许出现重复的键。
在TreeMap中是通过二叉树的原理来保证键的唯一性。
下面的案例演示了如何对TreeMap集合中的指定元素进行排序,代码如下:
importjava.util.*;
publicclassExample21{
publicstaticvoidmain(String[]args){
//穿入自定义比较器
TreeMaptm=newTreeMap(newMyComparator());
tm.put("1","Jack");//向集合存入学生的学号和姓名
tm.put("2","Rose");
tm.put("3","Lucy");
SetkeySet=tm.keySet();//获取键的集合
Iteratorit=keySet.iterator();//获得迭代器对象
while(it.hasNext()){
Objectkey=it.next();//获得一个键
Objectvalue=tm.get(key);//获得键对应的值
System.out.println(key+":
"+value);
}
}
}
classMyComparatorimplementsComparator{//自定义比较器
publicintcompare(Objectobj1,Objectobj2){
Stringid1=(String)obj1;//强转为String类型
Stringid2=(String)obj2;
returnpareTo(id1);//将比较之后的值返回
}
}
Properties集合
Map接口中还有一个实现类Hashtable,它和HashMap相比区别在于Hashtable是线程安全的。
Hashtable类有一个子类Properties在实际应用中非常重要,Properties主要用来存储字符串类型的键和值。
经常使用Properties集合来存取应用的配置项。
通过案例来学习Prorperties集合对配置项进行存取,具体如下:
importjava.util.*;
publicclassExample22{
publicstaticvoidmain(String[]args){
Propertiesp=newProperties();
p.setProperty("backgroup-color","red");
p.setProperty("Font-size","14px");
p.setProperty("Language","chinese");
Enumerationnames=p.propertyNames();
while(names.hasMoreElements()){
Stringkey=(String)names.nextElement();
Stringvalue=p.getProperty(key);
System.out.println(key+"="+value);
}
}
}
泛型
我们在程序中无法确定一个集合中的元素到底是什么类型的。
那么在取出
元素时,如果进行强制类型转换就很容易出错。
在Java中引入了“参数化类型(parameterizedtype)”这个概念,即泛型。
它可以限定方法操作的数据类型,在定义集合类时,可以使用“<参数化类型>”的方式指定该类中方法操作的数据类型,具体格式如下:
ArrayList<参数化类型>list=newArrayList<参数化类型>();
在使用泛型后每次遍历集合元素时,可以指定元素类型为String,而不是
Object,这样就避免了再程序中进行强制类型转换。
Collections工具类
✧Collections工具类简介
Collections类中提供了大量的方法用于对集合中元素进行排序、查找和修改等操作。
✧排序操作
importjava.util.*;
publicclassExample27{
publicstaticvoidmain(String[]args){
ArrayListlist=newArrayList();
Collections.addAll(list,"C","Z","B","K");//添加元素
System.out.println("排序前:
"+list);//输出排序前的集合
Collections.reverse(list);//反转集合
System.out.println("反转后:
"+list);
Collections.sort(list);//按自然顺序排列
System.out.println("按自然顺序排序后:
"+list);
Collections.shuffle(list);
System.out.println("洗牌后:
"+list);
}
}
✧查找、替换操作
importjava.util.*;
publicclassExample28{
publicstaticvoidmain(String[]args){
ArrayListlist=newArrayList();
Collections.addAll(list,-3,2,9,5,8);
System.out.println("集合中的元素:
"+list);
System.out.println("集合中的最大元素:
"+
Collections.max(list));
System.out.println("集合中的最小元素:
"+
Collections.min(list));
Collections.replaceAll(list,8,0);//将集合中的8用0替换
System.out.println("替换后的集合:
"+list);
}
}
Arrays工具类
✧使用Arrays的sort()方法排序
Arrays.sort(arr);
上述语法格式中,参数arr指的是一个数组。
✧使用Arrays的binarySearch(Object[]a,Objectkey)方法查找元素
intindex=Arrays.binarySearch(arr,3);//查找指定元素3的下标
该方法采用的是二分法查找。
所谓二分法查找就是每次将指定元素和数组中间位置的元素进行比较,从而排除掉其中的一半元素。
具体过程如下:
(1)判断开始索引start和结束索引end,如果start<=end,则key和arr[mid]进行比较,如果不相等,则返回元素arr[mid]。
(2)将key和arr[mid]继续进行比较,如果key(3)将查找区间的结束索引end置为mid-1,继续查找,直到start>end,表示查找的数组不存在,这时执行第五步。
(4)将查找区间的开始索引start置为mid+1,结束索引不变,继续查找,直到start>end,表示查找的数组不存在,这时执行第五步。
(5)返回“-(插入点)-1”。
这个“插入点”指的是大于key值的第一个元素在数组中的位置,如果数组中所有的元素值都小于要查找的对象,“插入点”就等于Arrays.size()。
✧使用copyOfRange(int[]original,intfrom,intto)方法拷贝元素
int[]copied=Arrays.copyOfRange(arr,from,to);
该方法中参数original表示被复制的数组,from表示被复制元素的初始索
引(包括),to表示被复制元素的最后索引(不包括)。
✧使用Arrays的fill(Object[]a,Objectval)方法填充元素
Arrays.fill(arr,8);//用8替换数组中的每一个值
✧使用Arrays的toString(int[]arr)方法把数组转换为字符串
//使用toString()方法将数组转换为字符串
StringarrString=Arrays.toString(arr);
注意:
该方法可将任意整数转为字符串。
第五课时
上机练习1(总结,测试题)
1、总结本章内容
2、通过题库发放相关测试题,检查学生掌握情况。
3、上机练习:
针对本章中需要重点掌握的知识点,以及在程序中容易出错的内容进行练习,通过上机练习可以考察同学对知识点的掌握情况,对代码的熟练程度。
上机一:
(考察知识点为list集合及集合的迭代)
请按照以下要求设计一个Example01类。
要求如下:
1)创建一个ArrayList集合alist,向集合中添加数据,获取集合中元
素的个数并打印出第三个元素。
2)创建LinkedList集合link,并向link添加四个元素。
3)向link集合的第一个位置插入元素,移除该集合中第三个元素。
第六课时
上机练习2(总结,测试题)
上机一:
(考察知识点为map集合)
请按照以下要求设计一个Example03类。
要求如下:
1)创建HashMap对象,存入元素,并迭代所有元素。
2)创建TreeMap对象,存入元素,并迭代所有元素。
上机二:
(考察知识点为set集合)
请按照以下要求设计一个Example02类。
要求如下:
1)创建HashSet集合,向该Set集合中添加字符串并迭代该集合所有元素。
2)创建TreeSet集合ts,并迭代该集合所有元素。
思考题和习题
见教材第7章后的习题
教
学
后
记