
教案课程名称黄潇《Web系统开发》授课教师教学题目教学时数3学时第3章泛型与集合1.泛型泛型类、泛型接口、泛型方法教学内容2.集合Collection、List、Set、Map集合1.知识目标:理解泛型机制和集合框架的概念和原理。理解集合框架的组成及常用集合类的使用。熟悉List接口,Set接口和Map接口的作用。2.能力目标:教学目标能独立使用Collection接口和Set接口以及Map接口。掌握迭代器的使用。培养学生的逻辑思维能力、团队协作精神和创新意识。3.思政目标:培养严谨、精益求精的大国工匠精神。培养学生的社会责任感、职业道德和团队协作精神,提升学生的综合素质。教学重点ArrayList类、LinkedList类、HashSet、HashMap类等的使用。教学难点选代器Iterator接口的使用。TreeSet类的使用。教学课型理论课授课手段多媒体教学口实验课授课方法讲授法+案例分析法+实践操作法专业术语Generics,Collection,List,Set,Map,Iterator1.梁永先、陈滢生、尹校军,JavaWeb程序设计(慕课版)第2版,人民邮电出版社,2021.3参考资料2.汪诚波,JavaWeb开发技术与实践,清华大学出版社,2018.93.千锋教育高教产品研发部,JavaWeb开发实战,清华大学出版社,2018.11实现字符出现次数的统计。课后作业具体要求:通过键盘输入一个字符串,按字母顺序打印出每个字符及其出现频率。教学后记
教 案 课程名称 《Web 系统开发》 授课教师 黄 潇 教学题目 第 3 章 泛型与集合 教学时数 3 学时 教学内容 1. 泛型 泛型类、泛型接口、泛型方法 2. 集合 Collection、List、Set、Map 集合 教学目标 1. 知识目标: 理解泛型机制和集合框架的概念和原理。 理解集合框架的组成及常用集合类的使用。 熟悉 List 接口,Set 接口和 Map 接口的作用。 2. 能力目标: 能独立使用 Collection 接口和 Set 接口以及 Map 接口。 掌握迭代器的使用。 培养学生的逻辑思维能力、团队协作精神和创新意识。 3. 思政目标: 培养严谨、精益求精的大国工匠精神。 培养学生的社会责任感、职业道德和团队协作精神,提升学生的综合素质。 教学重点 ArrayList 类、LinkedList 类、HashSet、HashMap 类等的使用。 教学难点 迭代器 Iterator 接口的使用。TreeSet 类的使用。 教学课型 理论课 实验课 授课手段 多媒体教学 授课方法 讲授法 + 案例分析法 + 实践操作法 专业术语 Generics,Collection,List,Set,Map,Iterator 参考资料 1. 梁永先、陈滢生、尹校军,Java Web 程序设计(慕课版)第 2 版,人民邮电出版社,2021.3 2. 汪诚波,Java Web 开发技术与实践, 清华大学出版社,2018.9 3. 千锋教育高教产品研发部,Java Web 开发实战,清华大学出版社,2018.11 课后作业 实现字符出现次数的统计。 具体要求:通过键盘输入一个字符串,按字母顺序打印出每个字符及其出现频率。 教学后记

复习旧课,引入新课教学设计:课前引导学生查找资料,提前了解集合在Java中的重要地位,并通过提问问题启发学生思考从而引出泛型,让学生对本讲内容的学习充满期待。一、复习旧课复习I/O流的知识点,设置提问:1.字节流和字符流的区别是,字符流用于传输(),而字节流可以传输()。2.java.io包中可以用于从文件中直接读取字符的是()类。3.字节输入流和字节输出流的抽象父类,分别是()和()。4.DatalnputStream和()是两个与平台无关的数据操作流。二、引入新课【引例】public class GenericDemolpublic staticvoid main(Stringlargs)Point pl = new Point(),pl.setX(2);int xl =pl.getX(,System.out.println(x1);37class Point(教学组织private Integer x, y,过程1publicIntegergetxO(return x)public void setX(Integer x) (this.x=x,)(10分钟)public Integer getYO (return y:)publicvoidsetY(Integery)(this.y=y:).如何Point的成员变量想换成其他类型,该怎么办?packagegenericspublicclassGenericDemoopublicstaticvoidmain(Stringllargs)PointObjectpl=newPointObject()pl.setX(2);int xl = (Integer)p1.getX(O);System.out.println(x1),PointObjectp2=newPointObjectO);p2.setX(2.2),doublex2= (Double)p2.getX()System.out.println(x2);1class PointObjectprivate Object x,y:public Object getx() returnx,!public void setX(Object x)this.x =x,1publicObjectgetYOreturn y, ?publicvoid setY(Integery)this.y=y,1
教学组织 过程 1 (10 分钟) 复习旧课,引入新课 教学设计: 课前引导学生查找资料,提前了解集合在 Java 中的重要地位,并通过提问问题启发 学生思考从而引出泛型,让学生对本讲内容的学习充满期待。 一、复习旧课 复习 I/O 流的知识点,设置提问: 1. 字节流和字符流的区别是,字符流用于传输( ),而字节流可以传输( )。 2. java.io 包中可以用于从文件中直接读取字符的是( )类。 3. 字节输入流和字节输出流的抽象父类,分别是( )和( )。 4. DataInputStream 和( )是两个与平台无关的数据操作流。 二、引入新课 【引例】 public class GenericDemo1 { public static void main(String[] args) { Point p1 = new Point(); p1.setX(2); int x1 = p1.getX(); System.out.println(x1); } } class Point{ private Integer x, y; public Integer getX() {return x;} public void setX(Integer x) {this.x = x;} public Integer getY() {return y;} public void setY(Integer y) {this.y = y;} } 如何 Point 的成员变量想换成其他类型,该怎么办? package generics; public class GenericDemo0 { public static void main(String[] args) { PointObject p1 = new PointObject(); p1.setX(2); int x1 = (Integer)p1.getX(); System.out.println(x1); PointObject p2 = new PointObject(); p2.setX(2.2); double x2 = (Double)p2.getX(); System.out.println(x2); } } class PointObject{ private Object x,y; public Object getX() { return x; } public void setX(Object x) { this.x = x; } public Object getY() { return y; } public void setY(Integer y) { this.y = y; } }

但是这样还存在些问题,比如每当使用其成员时,必须先进行强制类型转换。可以使用泛型来解决该问题。思政元素:强调编写安全、高效代码的重要性,引导学生思考作为程序员的社会责任。鼓励学生在解决问题时尝试不同的方法,培养创新意识和批判性思维。本讲主要内容教学设计:用参数的思想来介绍泛型,讲解常见的三种泛型及其使用,并使用泛型类来解决引例中存在的问题,从而加深学生对泛型的理解。3.1泛型(Generics)泛型是JDK5.0以后的新特性,它的本质是参数化类型,也就是说将所操作的数据类型指定为一个参数。这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型方法。·3.1.1泛型类1.语法:类名其中T、K、V等代表任意一种数据类型,可以是引用类型,不能是基本类型;泛型可以任意取名,但必须满足Java的命名规范,建议首字母是一个大写字母。2.【示例】使用泛型类解决引例中的问题如下:package generics;publicclassGenericDemo2(public static void main(String[]args)教学组织Entryel=new Entry<>("数学",95);过程3System.out.println(e1);(15分钟)2=newEntry<>("中国""山西");Entrye2System.out.println(e2);1class Entryfprivate T t;private E e;public Entry(T t,E e){this.t = t;this.e = e;7@Overridepublic string tostring() (return t+":"+e;}子·3.1.2泛型接口语法:接口名其中T、K、V等代表任意一种数据类型,可以是引用类型,不能是基本类型;泛型可以任意取名,但必须满足Java的命名规范,建议首字母是一个大写字母。·3.1.3泛型方法1.语法:访问控制修饰符返回值类型方法名(参数列表)方法体;1
但是这样还存在些问题,比如每当使用其成员时,必须先进行强制类型转换。——可 以使用泛型来解决该问题。 思政元素:强调编写安全、高效代码的重要性,引导学生思考作为程序员的社会责 任。鼓励学生在解决问题时尝试不同的方法,培养创新意识和批判性思维。 教学组织 过程 3 (15 分钟) 本讲主要内容 教学设计: 用参数的思想来介绍泛型,讲解常见的三种泛型及其使用,并使用泛型类来解决引 例中存在的问题,从而加深学生对泛型的理解。 3.1 泛型(Generics) 泛型是 JDK5.0 以后的新特性,它的本质是参数化类型,也就是说将所操作的数据类 型指定为一个参数。 这种参数类型可以用在类、接口和方法的创建中,分别称为泛型类、泛型接口、泛型 方法。 3.1.1 泛型类 1. 语法:类名 其中 T、K、V 等代表任意一种数据类型,可以是引用类型,不能是基本类型; 泛型可以任意取名,但必须满足 Java 的命名规范,建议首字母是一个大写字母。 2. 【示例】使用泛型类解决引例中的问题如下: package generics; public class GenericDemo2 { public static void main(String[] args) { Entry e1 = new Entry<>("数学",95); System.out.println(e1); Entry e2 = new Entry<>("中国","山西"); System.out.println(e2); } } class Entry{ private T t; private E e; public Entry(T t, E e) { this.t = t; this.e = e; } @Override public String toString() { return t + ": " + e; } } 3.1.2 泛型接口 语法:接口名 其中 T、K、V 等代表任意一种数据类型,可以是引用类型,不能是基本类型; 泛型可以任意取名,但必须满足 Java 的命名规范,建议首字母是一个大写字母。 3.1.3 泛型方法 1. 语法: 访问控制修饰符 返回值类型 方法名(参数列表){ 方法体; }

2.【示例】泛型方法的定义。public class GenericMethodDemo3publicstaticvoidmain(Stringlargs)Integer1=newInteger2.5.81/泛型方法的使用Integer ii=getFirstElement(i),System.out.println(ii),String[ls=newString[l"北京""上海""深圳"!1/泛型方法的使用String ss =getFirstElement(s);System.out.println(ss):2public static T getFirstElement(T It)泛型方法的定义return t[0];3。3.1.4限制泛型的可用类型1.两种方法:(1)表示泛型必须是指定类或者是指定类的子类。(2)表示泛型必须是指定接口或者是指定接口的实现类。2.【示例】限制泛型方法中泛型的可用类型。package generics;public class GenericMethodDemo (public static void main(stringl] args)Integer[] i= new Integer[](2,5,8];Integer ii =getFirstElement(i);System.out.println(ii);String[] s=newString[]"北京","上海","深圳"}//String ss=getFirstElement(s)//编译错误,因string并不是Number类或其子类。//System.out.println(ss);1public static T getFirstElement(T[] t)(return t[o];子·3.1.5使用类型通配符1.三种:(1)类型通配符语法:表示泛型可以是任意类型。(2)利用通配符指定类型的上限:语法:表示泛型必须是指定类型或者是指定类的子类。(3)利用通配符指定类型的下限:语法:表示泛型必须是指定类型或者是指定类的父类。2.【示例】GenericwildcardDemo.java
2. 【示例】泛型方法的定义。 public class GenericMethodDemo3 { public static void main(String[ ] args) { Integer[ ] i = new Integer[ ]{2,5,8}; Integer ii = getFirstElement(i); //泛型方法的使用 System.out.println(ii); String[ ] s = new String[ ]{"北京","上海","深圳"}; String ss = getFirstElement(s); //泛型方法的使用 System.out.println(ss); } public static T getFirstElement(T[ ] t){ //泛型方法的定义 return t[0]; } } 3.1.4 限制泛型的可用类型 1. 两种方法: (1) 表示泛型必须是指定类或者是指定类的子类。 (2) 表示泛型必须是指定接口或者是指定接口的实现类。 2. 【示例】限制泛型方法中泛型的可用类型。 package generics; public class GenericMethodDemo { public static void main(String[] args) { Integer[] i = new Integer[]{2,5,8}; Integer ii = getFirstElement(i); System.out.println(ii); String[] s = new String[]{"北京","上海","深圳"}; //String ss = getFirstElement(s)//编译错误,因String并不是Number 类或其子类。 //System.out.println(ss); } public static T getFirstElement(T[] t){ return t[0]; } } 3.1.5 使用类型通配符 1. 三种: (1)类型通配符 语法: 表示泛型可以是任意类型。 (2)利用通配符指定类型的上限: 语法: 表示泛型必须是指定类型或者是指定类的子类。 (3)利用通配符指定类型的下限: 语法: 表示泛型必须是指定类型或者是指定类的父类。 2. 【示例】 GenericWildcardDemo.java

package generics;public class GenericwildcardDemo(public static void main(stringll args)AAal=new BB(new Object())//AAa2=newBB(newInteger(1));//编译错误,类型不兼容AAa3=newBB(newInteger(3));a3 =newBB("test3");AAa4=newBB(newInteger(4));a4=newBB(new Double(4.4));//a4=newBB("test4");//编译错误,类型不兼容AAa5=new BB(new Integer(5));//a5=newBB(newDouble(5.5));//编译错误,类型不兼容72classAAT t;AA(T t)(this.t=t;)YclassBBextendsAA(BB(T t)(super(t);)·3.1.6泛型本质1.泛型和自动装箱拆箱一样,是编译器认可的,它的本质是Object类型,编译器在编译的时候,会自动进行类型的转换。inta=newInteger(1),/自动拆箱,等价于inta=newInteger(1).intValueO;Integerb=l;//自动装箱,等价于Integerb=Integer.valueOf(1);2.泛型使用注意事项:(1)泛型不能实例化。(2)如果AA是一个泛型类,那么,AA与AA是一个类。(3)泛型不能表示基本类型。(4)不能对确定泛型类型使用instanceof关键字,也不能创建确定泛型类型的数组。(5)使用泛型对象时,建议给定泛型的类型,否则存在安全隐患。【示例】:package generics;public classGenericDemo3(public static void main(String[] args)(//ccc1;//编译错误,因为泛型不能表示基本类型CC c1 = new CC<>();//booleanb1=c1instanceof cc//编译错误,CC[] c2 = new cC[](];//c2newCC[]0;CC c3=new CC();c3.t = 1;//ccc4=c3;//System.out.println(c4.t)://运行时出现类型转换异常
package generics; public class GenericWildcardDemo { public static void main(String[] args) { AA a1 = new BB(new Object()); //AA a2 = new BB(new Integer(1));//编译错误,类 型不兼容 AA a3 = new BB(new Integer(3)); a3 = new BB("test3"); AA a4 = new BB(new Integer(4)); a4 = new BB(new Double(4.4)); //a4 = new BB("test4");//编译错误,类型不兼容 AA a5 = new BB(new Integer(5)); //a5 = new BB(new Double(5.5));//编译错误,类型不兼容 } } class AA{ T t; AA(T t){ this.t=t; } } class BB extends AA{ BB(T t){ super(t); } } 3.1.6 泛型本质 1. 泛型和自动装箱拆箱一样,是编译器认可的,它的本质是 Object 类型,编译器在编译的 时候,会自动进行类型的转换。 int a = new Integer(1); //自动拆箱,等价于 int a = new Integer(1).intValue(); Integer b = 1; //自动装箱,等价于 Integer b = Integer.valueOf(1); 2. 泛型使用注意事项: (1) 泛型不能实例化。 (2) 如果 AA 是一个泛型类,那么,AA与 AA是一个类。 (3) 泛型不能表示基本类型。 (4) 不能对确定泛型类型使用 instanceof 关键字,也不能创建确定泛型类型的数组。 (5) 使用泛型对象时,建议给定泛型的类型,否则存在安全隐患。 【示例】: package generics; public class GenericDemo3 { public static void main(String[] args) { //CC c1;//编译错误,因为泛型不能表示基本类型 CC c1 = new CC<>(); //boolean b1 = c1 instanceof CC;//编译错误, CC[] c2 = new CC[]{}; //c2 = new CC[]{}; CC c3 = new CC(); c3.t = 1; //CC c4 = c3; //System.out.println(c4.t); //运行时出现类型转换异常

宁public staticvoidmethod(cc ci)f//这两个方法不是正确的重载,因为这两个方法的头部完全一样public staticvoidmethod(cCc2)f。。)金class CC//Tt=newT();Tt =(T)new Object();/T]ts=newT[J;T[] ts2 = (T[])new Object[]();7教学设计:通过提出几个问题,引导学生思考并尝试给出自己的想法,从而引出接下来要讲的集合,也同时激发学生的学习主动性。思政元素:通过Java集合柜架的学习,可以提高代码质量,降低代码维护成本,增加程序的复用性和可操作性,培养严谨、精益求精的大国工匠精神。【提问】存储一个班学员信息,假定一个班容纳20名学员,使用什么样的数据结构存储这个班学员信息更合适?一维数组【思考】如何存储每天的新闻信息?注意:每天的新闻总数不确定,太少浪费空间,太多空间不足【思考】如何存储课程的代码与课程信息,能够通过代码方便地获得课程信息?代码1代码N..对应课程1课程N......可以使如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象教学组织用Java集合框架。接下来,将介绍四个集合接口和它们的常见的实现类及其中的成员方法,过程4尤其是对集合进行排序、遍历的多种算法实现。(20分钟)3.2集合在程序设计中,合理存储、组织数据是非常重要的,除了数组,集合也可以用来存放、组织数据。集合也称为容器,在Java中集合是一个接口。Java集合框架提供了一套性能优良、使用方便的接口和类,它们位于java.util包中。CollectionMapListSetPArrayListLinkedListHashSetTreeSetHashMapTreeMapMap接口存储一组键值对象,提供key到value的映射。。3.2.1集合(Collection)1.List集合:有序的,可重复集,集合中的对象按照索引位置排序,可以通过索引位置对集合进行
} public static void method(CC c1){ 。} //这两个方法不是正确的重载,因为这两个方法的头部完全一样。 public static void method(CC c2){。 } } class CC{ //T t = new T(); T t = (T)new Object(); //T[] ts = new T[]{}; T[] ts2 = (T[])new Object[]{}; } 教学组织 过程 4 (20 分钟) 教学设计: 通过提出几个问题,引导学生思考并尝试给出自己的想法,从而引出接下来要讲的集 合,也同时激发学生的学习主动性。 思政元素:通过 Java 集合框架的学习,可以提高代码质量,降低代码维护成本,增加 程序的复用性和可操作性,培养严谨、精益求精的大国工匠精神。 【提问】存储一个班学员信息,假定一个班容纳 20 名学员,使用什么样的数据结构 存储这个班学员信息更合适? 一维数组 【思考】如何存储每天的新闻信息? 注意:每天的新闻总数不确定,太少浪费空间,太多空间不足 【思考】如何存储课程的代码与课程信息,能够通过代码方便地获得课程信息? 如果并不知道程序运行时会需要多少对象,或者需要更复杂方式存储对象——可以使 用 Java 集合框架。接下来,将介绍四个集合接口和它们的常见的实现类及其中的成员方法, 尤其是对集合进行排序、遍历的多种算法实现。 3.2 集合 在程序设计中,合理存储、组织数据是非常重要的,除了数组,集合也可以用来存放、 组织数据。 集合也称为容器,在 Java 中集合是一个接口。 Java 集合框架提供了一套性能优良、使用方便的接口和类,它们位于 java.util 包中。 Map 接口存储一组键值对象,提供 key 到 value 的映射。 3.2.1 集合(Collection) 1. List 集合: 有序的,可重复集,集合中的对象按照索引位置排序,可以通过索引位置对集合进行

操作。0t2345aaaaddddccce3333ddddcecList有两个实现类:ArrayList和LinkListaaaa2.Set集合ddddCCCC不可重复集,大部分实现是无序的。Set有两个实现类:HashSet和TreeSet3.Queue集合也称为队列,可重复集。对象按照先进先出的规则来排列,在队尾添加元素,在队头删除元素。·3.2.1.1Collection集合的基本操作(1)元素添加、删除操作.booleanadd(Objectelement)//添加成功返回true,否则返回false·booleanremove(Objectelement)//注意:最多只删除一个元素/删除与给定对象相同的元素,删除成功返回true,否则返回false(2)查询操作:·intsize():返回当前集合中元素的数量·booleanisEmpty(O:当前集合是否为空·booleancontains(Objectel):当前集合是否包含el对象。·IteratoriteratorO:返回一个迭代器,用于遍历集合各个元素。·voidclearO):删除集合中的所有元素。示例:package collections;import java.util.*;public class CollectionDemol (public static void main(String[l args)Collection c1 = newArrayList();c1.add(1);c1.add(2);c1.add(3);System.out.println(c1.add(1));System.out.println(c1);Collection c2= new HashSet();c2.add(3);c2.add(1);c2.add(2);System.out.println(c2.add(1));//将输入false,因Set集合是不可重复集System.out.println(c2);System.out.println(c2.remove(2));System.out.println(c2);System.out.println(c1.remove(1));System.out.println(c1);//注意:remove方法蛤多只删除一个元素System.out.println(c1.size());System.out.println(c1.contains(1));7.3.2.1.2Collection集合的批量操作·booleanaddAll(Collectionc)/*将给定集合的所有元素添加到当前集合中,添加成功
操作。 List 有两个实现类:ArrayList 和 LinkList 2. Set 集合 不可重复集,大部分实现是无序的。 Set 有两个实现类:HashSet 和 TreeSet 3. Queue 集合 也称为队列,可重复集。 对象按照先进先出的规则来排列,在队尾添加元素,在队头删除元素。 3.2.1.1 Collection 集合的基本操作 (1)元素添加、删除操作 boolean add(Object element) //添加成功返回 true,否则返回 false boolean remove(Object element) //注意:最多只删除一个元素 //删除与给定对象相同的元素,删除成功返回 true,否则返回 false (2)查询操作: int size():返回当前集合中元素的数量 boolean isEmpty():当前集合是否为空 boolean contains(Object el) :当前集合是否包含 el 对象。 Iterator iterator():返回一个迭代器,用于遍历集合各个元素。 void clear():删除集合中的所有元素。 示例: package collections; import java.util.*; public class CollectionDemo1 { public static void main(String[] args) { Collection c1 = new ArrayList(); c1.add(1); c1.add(2); c1.add(3); System.out.println(c1.add(1)); System.out.println(c1); Collection c2 = new HashSet(); c2.add(1); c2.add(2); c2.add(3); System.out.println(c2.add(1));//将输入false,因Set集合是不可重复集 System.out.println(c2); System.out.println(c2.remove(2)); System.out.println(c2); System.out.println(c1.remove(1)); System.out.println(c1);//注意:remove方法蛤多只删除一个元素 System.out.println(c1.size()); System.out.println(c1.contains(1)); } } 3.2.1.2 Collection 集合的批量操作 boolean addAll (Collection c) /*将给定集合的所有元素添加到当前集合中,添加成功

返回true,否则返回false。注意:Set不能添加相同的元素。*/·booleanremoveAll (Collectionc):booleancontainsAll (Collection c)·voidretainAll(Collectionc)://从集合中删除集合c中不包含的元素*集合的复制构造器:创建集合的实现类的对象时候,可以传入一个集合,那么创建的集合包含传入集合的所有元素。*/例:Collectionc3=newArrayList(cl);Collectionc3=cl;//其中c1是一个已经存在的集合类。·3.2.1.3Collection集合的遍历操作遍历集合要使用迭代器模式,Iterator接口提供了遍历集合的统一入口。调用集合的iteratoro方法可以获得遍历集合的迭代器对象,通过这个对象来遍历集合。(思政元素:我们需要不断地反思自己的想法和行为,并总结经验教训,为自己的未来发展打下坚实的基础。)1.Iterator接口中有如下方法;·booleanhasNextO:是否存在另一个可访问的元素。。ObjectnextO:返回要访问的下一个元素。。voidremoveO:将迭代器新返回的元素删除。/*注意:remove()必须紧跟在nexto)方法后执行,在每次调用next()时,remove方法只能被调用一次。*/2.Iterator基本用法一一遍历一个集合初始状态Iteratorit=Collection集合对象.iteratorO,获得迭代器next()obj1while(it.hasNextO)(obj21/得到下一个元素Object obj = it.next(),//处理obj3遍历完毕。示例:import java.util.*;public class ConectionIteratorpublic static void main(String[l args)Collection c1 = new ArrayList();cl.add("Java");c1.add(null);c1.add("c");c1.add("python");System.out.println(c1);Iterator it = c1.iterator();while(it.hasNext())String element - (String)it.next();if("c".equals(element))如果换作element.equals(“c"),可以吗?it.remove();System.out.println(element);7System.out.println(c1);子73.foreach语句
返回 true,否则返回 false。注意:Set 不能添加相同的元素。 */ boolean removeAll (Collection c) boolean containsAll (Collection c) void retainAll(Collection c)://从集合中删除集合 c 中不包含的元素 /*集合的复制构造器:创建集合的实现类的对象时候,可以传入一个集合,那么创 建的集合包含传入集合的所有元素。*/ 例:Collection c3 = new ArrayList(c1); Collection c3 = c1; //其中 c1 是一个已经存在的集合类。 3.2.1.3 Collection 集合的遍历操作 遍历集合要使用迭代器模式,Iterator 接口提供了遍历集合的统一入口。调用集合的 iterator()方法可以获得遍历集合的迭代器对象,通过这个对象来遍历集合。 (思政元素: 我们需要不断地反思自己的想法和行为,并总结经验教训,为自己的未来发展打下坚实的 基础。) 1. Iterator 接口中有如下方法; boolean hasNext():是否存在另一个可访问的元素。 Object next():返回要访问的下一个元素。 void remove():将迭代器新返回的元素删除。 /*注意:remove()必须紧跟在 next()方 法后执行,在每次调用 next()时,remove 方法只能被调用一次。 */ 2. Iterator 基本用法--遍历一个集合 Iterator it = Collection 集合对象.iterator(); // 获得迭代器 while(it.hasNext()) { Object obj = it.next(); // 得到下一个元素 //处理 obj } 示例: import java.util.*; public class ConectionIterator { public static void main(String[] args) { Collection c1 = new ArrayList(); c1.add("Java"); c1.add(null); c1.add("C"); c1.add("python"); System.out.println(c1); Iterator it = c1.iterator(); while(it.hasNext()){ String element = (String)it.next(); if(“C”.equals(element)) //如果换作element.equals(“C”),可以吗? it.remove(); System.out.println(element); } System.out.println(c1); } } 3. foreach 语句

语法:for(元素的类型元素变量:待遍历的数组或集合)包含元素变量的语句3示例:for(Objecto:cl)System.out.println(o);注意:新循环并非新的语法,只是像拆装箱一样被编译器认可的,意思是对集合进行新循环遍历时,编译器会自已将其编译成送代器语句,而对数组的新循环遍历则编译成普通的for语句。。3.2.1.4使用集合的注意事项(1)集合中只能存放引用类型,并且存放的是对象的引用;因为自动装箱,所以也可以向集合中添加基本数据类型的元素。(2)集合中理论上可以添加任何类型的元素,但是不建议这么做,因为在使用集合元素的时候就要进行大量的判断。Collection实际上是泛型接口,在使用的时候,建议指定泛型的具体的类型,存放相同类型的元素。(3)在遍历集合的过程中,一旦监测到集合被修改,就会抛出并发修改异常(ConcurrentModificatinException)。所以,遍历集合时不能对集合进行修改的,不论是使用选代器还是新循环进行遍历。示例:import java.util.*;public class ConectionDemo4{public static void main(String[] args)Point p= new Point(0, 0);Collection c1 = new ArrayList();c1.add(p); System.out.println(c1);p.setx(1); p.setY(1);System.out.println(c1);Collectionc2=newArrayList();c2.add(1);c2.add(2);c2.add(3);Iterator it = c2.iterator();while(it.hasNext())(//c2.add(4):/ /运行时抛出并发修改异常System.out.println(it.next());Tfor(Integer i: c2)(c2.remove(4);//这行执行时会抛出并发修改异常吗?System.out.println(i);T
语法: for(元素的类型 元素变量:待遍历的数组或集合){ 包含元素变量的语句 } 示例:for(Object o:c1){ System.out.println(o); } 注意:新循环并非新的语法,只是像拆装箱一样被编译器认可的,意思是对集合进行 新循环遍历时,编译器会自己将其编译成迭代器语句,而对数组的新循环遍历则编译成普 通的 for 语句。 3.2.1.4 使用集合的注意事项 (1)集合中只能存放引用类型,并且存放的是对象的引用;因为自动装箱,所以也可以 向集合中添加基本数据类型的元素。 (2)集合中理论上可以添加任何类型的元素,但是不建议这么做,因为在使用集合元素 的时候就要进行大量的判断。Collection 实际上是泛型接口,在使用的时候,建议指定泛型 的具体的类型,存放相同类型的元素。 ( 3) 在 遍 历集 合 的 过 程 中 , 一旦 监 测 到 集 合 被 修改 , 就 会 抛 出 并发 修 改 异 常 (ConcurrentModificatinException)。所以,遍历集合时不能对集合进行修改的,不论是使 用迭代器还是新循环进行遍历。 示例: import java.util.*; public class ConectionDemo4 { public static void main(String[] args) { Point p= new Point(0, 0); Collection c1 = new ArrayList(); c1.add(p); System.out.println(c1); p.setX(1); p.setY(1); System.out.println(c1); Collection c2 = new ArrayList(); c2.add(1); c2.add(2); c2.add(3); Iterator it = c2.iterator(); while(it.hasNext()){ //c2.add(4); //运行时抛出并发修改异常 System.out.println(it.next()); } for(Integer i: c2){ c2.remove(4); //这行执行时会抛出并发修改异常吗? System.out.println(i); } } }

教学设计:List集合是常用到的有序集合,通过示例和课堂练习的方式讲解List集合是如何存储和访问数据的。思政元素:对于课堂练习编程运行过程中出现的错误,加以引导,让同学们能够做到举一反三,具有解决问题的能力和严谨的软件工匠精神。·3.2.2List集合List集合,可重复集,集合中的对象按照索引位置排序,可以通过索引位置对集合进行操作。List的实现类主要有:ArrayList、LinkList、VectorList除了拥有Collection接口的所有的方法外,还添加了面向位置的操作方法。·面向位置的操作包括插入某个元素或Collection的功能:还包括获取、除去或更改元素的功能;在List中搜索元素可以从列表的头部或尾部开始,如果找到元素,还将报告元素所在的位置。1、一些面向位置的操作方法:·voidadd(intindex,Objectel):添加对象el到位置index上·booleanaddAll(intindex,Collectionc):在index位置后添加容器c中所有的元素·Objectget(intindex):取出下标为index的位置的元素·intindexOf(Objectel):查找对象el在List中第一次出现的位置教学组织·intlastlndexOf(Objectel):查找对象el在List中最后出现的位置过程5·Objectremove(intindex):删除index位置上的元素(20分钟)。Objectset(intindex,Objectel):将index位置上的对象替换为el并返回老的元素。·ListsubList(intfromlndex,inttolndex):返回一个子列表List,范围是[fromlndex,tolndex)元素。注意:原集合中的改变也将影响该子列表集合。2.对List集合对象进行的排序操作方法:往往使用Collections类中的下面两个方法来实现:。staticvoidsort(Listlist)1/使用自然顺序进行排序. static void sort(List list, Comparator c)/使用客户顺序进行排序示例:package listsimport java.util.*;public class ListSortDemol1public static void main(Stringl) args)ListIl=newArrayList(),1l.add("zhangsan"),I1.add("lisi")Il.add("wangwu"),System.out.println(11),*名内部类:这个类定义后只使用一次Comparatorc=newMyComparatorO@Overridepublic intcompare(String argo,Stringargl)returnarg0.length(-argl.lengthO
教学组织 过程 5 (20 分钟) 教学设计: List 集合是常用到的有序集合,通过示例和课堂练习的方式讲解 List 集合是如何存储 和访问数据的。 思政元素:对于课堂练习编程运行过程中出现的错误,加以引导,让同学们能够做到 举一反三,具有解决问题的能力和严谨的软件工匠精神。 3.2.2 List 集合 List 集合,可重复集,集合中的对象按照索引位置排序,可以通过索引位置对集合进行操 作。 List 的实现类主要有:ArrayList、LinkList、Vector List 除了拥有 Collection 接口的所有的方法外,还添加了面向位置的操作方法。 面向位置的操作包括插入某个元素或 Collection 的功能; 还包括获取、除去或更改元素的功能; 在 List 中搜索元素可以从列表的头部或尾部开始,如果找到元素,还将报告元素所 在的位置。 1. 一些面向位置的操作方法: void add(int index, Object el) :添加对象 el 到位置 index 上 boolean addAll(int index, Collection c) :在 index 位置后添加容器 c 中所有的元素 Object get(int index) :取出下标为 index 的位置的元素 int indexOf(Object el) :查找对象 el 在 List 中第一次出现的位置 int lastIndexOf(Object el) :查找对象 el 在 List 中最后出现的位置 Object remove(int index) :删除 index 位置上的元素 Object set(int index, Object el) :将 index 位置上的对象替换为 el 并返回老的元素。 List subList(int fromIndex, int toIndex) :返回一个子列表 List,范围是[fromIndex, toIndex)元素。 注意:原集合中的改变也将影响该子列表集合。 2. 对 List 集合对象进行的排序操作方法: 往往使用 Collections 类中的下面两个方法来实现: static void sort(List list) //使用自然顺序进行排序 static void sort(List list, Comparator c) //使用客户顺序进行排序 示例: package lists; import java.util.*; public class ListSortDemo1_1 { public static void main(String[] args) { List l1 = new ArrayList(); l1.add("zhangsan"); l1.add("lisi"); l1.add("wangwu"); System.out.println(l1); /*匿名内部类:这个类定义后只使用一次 Comparator c = new MyComparator(){ @Override public int compare(String arg0, String arg1) { return arg0.length()-arg1.length();