单元9 集合电子课件_第1页
单元9 集合电子课件_第2页
单元9 集合电子课件_第3页
单元9 集合电子课件_第4页
单元9 集合电子课件_第5页
已阅读5页,还剩88页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单元九集合集合的概述Collection集合List集合Set集合Map集合泛型Java集合可以在程序设计中实现传统的数据结构,是一个用来存储对象的容器,也就是说集合中只能存储对象,如果向集合中加入基本类型数据,系统会将其自动装箱后存入集合。集合可存储不同数据类型元素,集合的长度可改变。本单元的学习目标如下。单元九集合教学目标知识目标:技能目标:素养目标:掌握常用集合类的功能熟悉List集合、Set集合和Map集合的区别掌握集合遍历的方法能够恰当运用Java集合能够正确Java集合的相关类能够独立完成拓展任务懂得只有功夫深,铁杵磨成针的道理明白拥有怎样的认知,就会拥有怎样的财富的意义掌握集合中泛型的使用9.1知识储备–集合的概述Java集合也称为容器,用来在java.util包下存储Java类的对象。某一个对象一旦被放入集合,其类的信息将丢失,也就是说集合内存储的对象都是Object类型的。Object类是所有类的父类,因此,集合可存储任意类型的对象,这一特点同时也会带来不便,如当获取集合中元素时,需要使用强制类型转换将其类型转换为指定的数据类型。9.1.1集体的概述Java集合分为Collection集合(单列集合)和Map集合(双列集合)。Collection集合为根接口,常用的子接口有List集合、Queue集合和Set集合,List集合常用的实现类有ArrayList集合和LinkedList集合,Set集合常用的实现类有HashSet集合和TreeSet集合。Map集合常用的实现类有HashMap集合和TreeMap集合,HashMap集合常用的子类有LinkedHashMap集合。集合的继承关系如图9-1所示。Collection集合(单列集合)Map集合(双列集合)List集合Set集合ArrayList实现类LinkedList实现类HashSet实现类TreeSet实现类HashMap实现类TreeMap实现类LinkedHashMap子类9.1.1集体的概述Java中的数组可以保存多个数据元素,且数组元素类型必须相同,数组长度不能改变,但在实际应用中很多情况下,元素类型及元素的个数无法确定,集合的诞生可以解决此类问题,集合的长度可变,集合元素的数据类型可不相同。Java的集合在java.util包下,用来存储Java类的对象。某一个对象一旦被放入集合,其类的信息将丢失,也就是说集合内存储的对象都是Object类型对象,Object类是所有类的父类,因此,集合中可容纳任意类型的对象,这一特点同时也会带来不便,当获取集合中元素时,需要使用强制类型转换将其转换为指定的数据类型。9.1.1集体的概述9.1知识储备–Collection集合

List集合Queue集合

Set集合Collection集合是单列集合的根接口,用于存储一系列符合某种规则的元素,其子接口有List集合、Queue集合和Set集合。List集合的特点是元素有序且可重复,Queue集合的特点是队列先进先出,Set集合的特点是元素无序且不可重复。我们重点学习List集合和Set集合。Collection集合定义了一些常用的方法,通过这些方法可以实现对集合的基本操作,Collection集合常用方法如表9-1所示。9.1.2Collection集合方法声明方法描述booleanadd(Ee)向集合中添加一个元素booleanaddAll(Collectionc)将指定集合中的所有元素添加到集合中voidclear()清除集合中所有元素booleancontains(Objecto)判断集合中是否存在指定元素booleancontainsAll(Collectionc)判断集合中是否包含集合c中的所有元素booleanisEmpty()判断集合是否为空Iterator<E>iterator()返回一个Iterator对象,用于遍历集合中的元素booleanremove(Objecto)从集合中删除第一个符合条件的元素booleanremoveAll(Collectionc)从集合中删除所有集合c的元素intsize()返回集合中元素的个数表9-1Collection集合常用方法9.1.2Collection集合9.1知识储备–List集合

ArrayList类LinkedList类List集合继承了Collection集合,List集合可以对集合中的每个元素进行精确的控制,根据元素的索引来获取元素的值。List集合中的元素是有序的,即添加和删除元素的顺序是相同的;List集合中的元素是可重复的,即可同时出现多个相同的元素,通过索引来访问指定位置的元素。List集合默认按元素的添加顺序设置元素的索引,第一个添加到List集合中的元素的索引为0,第二个索引为1,依此类推。List集合除了继承Collection集合的方法外,还添加了一些根据索引操作元素的方法,List集合常用方法如表9-2所示。9.1.3List集合9.1.3List集合方法声明方法描述voidadd(intindex,Eelement)在集合中指定的位置上插入指定的元素booleanaddAll(Collectionc)追加指定集合的所有元素到该集合的末尾booleanaddAll(intindex,Collectionc)将指定集合中的所有元素插入到该集合指定位置voidclear()从集合中移除所有的元素Objectget(intindex)返回此集合中指定位置的元素intindexOf(Objecto)返回集合中指定元素的第一个出现的索引值,如果指定元素不存在,返回-1。intlastIndexOf(Objecto)返回集合中指定元素的最后一次出现的索引值,如果指定元素不存在,返回-1。ListsubList(intfromIndex,inttoIndex)返回一个从索引fromIndex(包含)到索引toIndex(不包含)所有元素组成的子集合表9-2List集合常用方法List集合除了继承Collection集合的方法外,还添加了一些根据索引操作集合元素的方法,常用List集合方法见表9-2。List集合常用的实现类有ArrayList集合和LinkedList集合。1.ArrayList集合ArrayList集合内部封装了可变长度的数组对象,当添加的元素长度超过默认长度时,ArrayList集合会在内存中分配一个长度更长的数组来存储这些元素。ArrayList集合提供3个常用构造方法,如表9-3所示。9.1.3List集合构造方法声明构造方法描述ArrayList()构造一个初始化容量为10的空列表ArrayList(Collectionc)构造一个包含指定collection元素的列表ArrayList(intinitialCapacity)构造一个指定初始容量的空列表ArrayList提供3个构造方法,见表9-3。表9-3ArrayList集合构造方法ArrayList的方法大部分是从List集合和Collection集合继承而来,通过这些方法可以实现对集合元素的添加、删除、修改和获取等操作。9.1.3List集合【例9-1】使用ArrayList向集合中添加三名学生信息,包括学号、性别和姓名,然后遍历集合输出这些学生信息。操作步骤:(1)新建unit09工程,在工程unit09的src目录下创建包.cvit.list,在包.cvit.list下创建类Student。(2)在Student.java文件中,定义成员变量,分别为id(学号),name(姓名)和gender(性别),创建无参构造方法和有参构造方法,重写toString方法,Student.java文件代码如下:9.1.3List集合package.cvit.list;

/**

*Student类

*/

publicclassStudent{

privateStringid;

privateStringname;

privateStringgender;

publicStudent(){

}

publicStudent(Stringid,Stringname,Stringgender){

this.id=id;

this.name=name;

this.gender=gender;

}……

……

publicStringgetId(){

returnid;

}

publicvoidsetId(Stringid){

this.id=id;

}

publicStringgetName(){

returnname;

}

publicvoidsetName(Stringname){

this.name=name;

}

publicStringgetGender(){

returngender;

}

publicvoidsetGender(Stringgender){

this.gender=gender;

}

@Override

publicStringtoString(){

return"学号:"+id+",姓名:"+name+",性别:"+gender;

}

}Student.java文件代码:9.1.3List集合(3)在.cvit.list包下创建测试类ArrayListDemo。在ArrayListDemo.java文件中,定义main()方法,在main()方法中实例化ArrayList对象,分别向ArrayList对象添加3个学生对象,遍历输出ArrayList对象中所有元素,ArrayListDemo.java文件代码如下:9.1.3List集合package.cvit.list;

importjava.util.ArrayList;

/**

*ArrayList集合

*/

publicclassArrayListDemo{

publicstaticvoidmain(String[]args){

ArrayListlist=newArrayList();

//实例化ArrayList对象

list.add(newStudent("001","Tony","男"));

//向ArrayList对象中添加3个学生对象元素

list.add(newStudent("002","Alice","女"));

list.add(newStudent("003","Rose","女"));

for(inti=0;i<list.size();i++){

//遍历ArrayList对象,输出3个学生基本信息

System.out.println(list.get(i));

}

}

}ArrayListDemo.java文件代码:9.1.3List集合(4)在文本编辑器视图中,单击运行“”按钮,运行结果如图9-2所示。9.1.3List集合提示:可以向ArrayList对象中添加重复的数据,也可以添加其它类型数据。集合元素的索引号从0到集合的大小减1。ArrayList集合在使用时需要导入java.util.ArrayList包,在IDEA中,快速导包的方法就是将光标移至ArrayList上,按照系统提示,按Alt+Enter键即,如图9-3所示。9.1.3List集合2.LinkedList类ArrayList类内部封装的是可变长数组,可快速搜索指定元素,在文件尾部添加和删除元素速度也比较快,但是,在任意位置插入和删除元素速度相对较慢,List集合的另外一个实现类LinkedList可以弥补ArryaList的不足。LinkedList类采用链表结构保存对象,占用的内存空间比较大,其优点是便于向集合中插入或者删除元素。如果需要频繁向集合中插入和删除元素时,选择LinkedList类,其效率远高于ArrayList类,但是LinkedList类随机访问元素的速度相对较慢,因此,如果需要大量访问集合元素时,可选用ArrayList类。9.1.3List集合LinkedList类提供了2个构造方法,见表9-4。表9-4LinkedList类构造方法构造方法声明构造方法描述LinkedList()构造一个LinkedList的空列表LinkedList(Collectionc)构造一个包含指定collection元素的列表9.1.3List集合LinkedList类除了继承了List集合和Collection集合的方法外,还提供了一些特有的方法,见表9-5。表9-5LinkedList类常用方法方法声明方法描述voidaddFirst(Ee) 将指定元素添加到集合的开头voidaddLast(Ee) 将指定元素添加到集合的末尾ObjectgetFirst() 返回集合的第一个元素ObjectgetLast() 返回集合的最后一个元素ObjectremoveFirst()删除集合中的第一个元素ObjectremoveLast()删除集合中的最后一个元素9.1.3List集合【例9-2】使用LinkedList类向集合添加不同种类面包的销售排名,并按照销售额排名,输出第一名和最后一名。操作步骤:(1)在包.cvit.list下创建类LinkedListDemo。(2)在LinkedListDemo.java文件中,定义main()方法。(3)文本编辑器视图中,撰写代码如下:9.1.3List集合9.1.3List集合package.cvit.list;

importjava.util.LinkedList;

/**

*LinkedList集合

*/

publicclassLinkedListDemo{

publicstaticvoidmain(String[]args){

LinkedListlink=newLinkedList();

//实例化LinkedList集合对象

link.add("豆沙面包");

link.add("椰蓉面包");

link.add("全麦低糖面包");

link.add("提子面包");

link.addFirst("老式杂粮面包");

//向集合插入第一个元素

System.out.println("所有种类面包销售排名:");

for(inti=0;i<link.size();i++){

//遍历集合

System.out.print(link.get(i)+"");

}

System.out.println("\n销售排名第一的面包:"+link.getFirst());

System.out.println("销售排名最后的面包:"+link.getLast());

}

}(4)在文本编辑器视图中,单击运行“”按钮,运行结果如图9-4所示。9.1.3List集合提示:通过LinkedList特有的方法,可以快速地添加、修改、删除第一个元素和最后一个元素。LinkedList的元素是有序的,可重复的。9.1知识储备–Iterator接口

Iterator常用方法Iterator的应用Iterator接口是Java迭代器,用于遍历集合,Iterator不是集合,是用于访问集合的方法。Iterator对象的使用依赖于集合对象,可通过集合对象的iterator()方法来获取Iterator对象。Iterator接口常用方法见表9-6。表9-6Iterator接口常用方法方法声明方法描述booleanhasNext()如果被迭代的集合还有下一个元素,则返回trueObjectnext()返回迭代中的下一个元素defaultvoidremove()删除集合中上一个next()方法返回的元素9.1.4Iterator接口【例9-3】编写一个程序,使用Iterator遍历集合。操作步骤:(1)在工程的src目录下创建包.cvit.iterator,在.cvit.iterator包下创建类IteratorDemo。(2)在IteratorDemo.java文件中,定义main()方法。(3)文本编辑器视图中,撰写代码如下:9.1.4Iterator接口package.cvit.iterator;

importjava.util.ArrayList;

importjava.util.Iterator;

/**

*Iterator遍历集合

*/

publicclassIteratorDemo{

publicstaticvoidmain(String[]args){

ArrayListlist=newArrayList();

//实例化一个ArrayList集合对象

list.add("byte");

//分别向集合添加Java基本数据类型说明符

list.add("short");

list.add("int");

list.add("long");

list.add("char");

list.add("float");

list.add("double");

list.add("boolean");

Iteratorit=list.iterator();

//通过集合对象的iterator()方法获取Iterator对象

System.out.println("Java基本数据类型说明符如下:");

while(it.hasNext()){

//遍历集合,hasNext()方法--判断集合是否有下一个元素

Objectobj=it.next();

//next()方法--获取集合中下一个元素

System.out.print(obj+"");

}

}

}9.1.4Iterator接口(4)在文本编辑器视图中,单击运行按钮,运行结果如图9-5所示。

提示:Iterator接口属于集合中的一员,只能用于遍历集合,不能集合之外的其它地方。Iterator接口遍历集合时,while循环条件是Iterator对象的hasNext(),直到集合中没有下一个元素,结束循环。9.1.4Iterator接口9.1.4Iterator接口【例9-4】使用Iterator迭代器删除集合元素。操作步骤:(1)在包.cvit.iterator下创建类IteratorRemove。(2)在IteratorRemove.java文件中,定义main()方法。(3)文本编辑器视图中,撰写代码如下:/**

*通过Iterator对象删除集合元素

*/

publicclassIteratorRemove{

publicstaticvoidmain(String[]args){

ArrayListlist=newArrayList();

//实例化一个ArrayList集合对象

list.add("byte");

//分别向集合添加Java基本数据类型说明符

list.add("short");

list.add("int");

list.add("long");

list.add("char");

list.add("float");

list.add("double");

list.add("boolean");

Iteratorit=list.iterator();

//通过集合对象的iterator()方法获取Iterator对象

while(it.hasNext()){

//使用Iterator迭代器遍历集合

Stringobj=(String)it.next();

if("short".equals(obj)){

//判断集合元素是否为short,是使用remove()方法删除该元素

it.remove();

}

}

System.out.println("Java基本数据类型说明符(除short之外)如下:");

System.out.print(list);

}

}9.1.4Iterator接口(4)在文本编辑器视图中,单击运行按钮,运行结果如图9-6所示。

提示:Iterator对象删除集合元素后,需要再遍历输出,才能看出效果。直接输出集合对象时,输出的所有集合元素用方括号括起来。9.1.4Iterator接口9.1知识储备–foreach循环

foreach循环格式

foreach循环的应用虽然通过for循环和Iterator迭代器都可以遍历集合,但相对比较繁琐,foreach循环也称为增强for循环,可以更简单地实现集合遍历。foreach循环不仅可以遍历集合,还可以遍历数组。foreach循环的一般格式:for(容器中元素类型临时变量:容器变量){

代码块}其中,容器可以是数组,也可以是集合,临时变量代表容器元素,容器变量是数组对象或者集合对象。9.1.5foreach循环【例9-5】编写程序,使用foreach遍历集合。操作步骤:(1)在工程的src目录下创建包.cvit.foreach,在包.cvit.foreach下创建类ForeachDemo。(2)在ForeachDemo.java文件中,定义main()方法。(3)文本编辑器视图中,撰写代码如下:9.1.5foreach循环package.cvit.foreach;

importjava.util.ArrayList;

/**

*foreach循环遍历集合

*/

publicclassForeachDemo{

publicstaticvoidmain(String[]args){

ArrayListlist=newArrayList();

list.add("Tony");

list.add("Alice");

list.add("Tom");

System.out.print("集合元素有:");

//foreach遍历集合,Object--集合元素类型,O--集合元素变量,list--集合变量

for(Objecto:list){

System.out.print(o+"\t");

}

}

}

9.1.5foreach循环(4)在文本编辑器视图中,单击运行按钮,运行结果如图9-7所示。

提示:在IDEA中,快速书写foreach的方法输入iter加回车键,或者iter加tab键。

foreach循环遍历集合时,只能访问集合中的元素,不能删除集合元素。9.1.5foreach循环9.1知识储备–Set集合

HashSet类TreeSet类Set集合同样继承了Collection集合,Set集合中的元素无序、不重复,且最多只能包含一个null元素,Set集合的常用实现类有HashSet和TreeSet。Set集合的常用方法与Collection集合基本相同。1. HashSet类HashSet是Set集合的典型实现类,HashSet是按照Hash算法来存储集合元素,具有很好的存取和查找性能。当向HashSet集合中存入一个元素时,HashSet将调用该对象的hashCode()方法来得到对象的hashCode值,根据hashCode值决定该对象的存储位置。在HashSet集合中,若两个对象的hashCode值相等且通过equals()方法比较返回结果为true,则HashSet集合认为两个元素相等。9.1.6Set集合HashSet集合常用构造方法见表9-7。表9-7HashSet集合构造方法构造方法声明构造方法描述HashSet()构造一个HashSet集合HashSet(Collectionc)构造一个包含指定collection集合对象的列表9.1.6Set集合【例9-7】使用HashSet集合类向集合中添加4句描写春夏秋冬的诗句,并使用Iterator接口实现集合遍历。操作步骤:(1)在工程的src目录下创建包.cvit.set,在包.cvit.set下创建类HashSetDemo。(2)在HashSetDemo.java文件中,定义main()方法。(3)文本编辑器视图中,撰写代码如下:9.1.6Set集合package.cvit.set;

importjava.util.HashSet;

importjava.util.Iterator;

/**

*HashSet集合

*/

publicclassHashSetDemo{

publicstaticvoidmain(String[]args){

HashSetpoems=newHashSet();

//实例化HashSet集合对象

poems.add("好雨知时节,当春乃发生。");

//向集合对象添加元素

poems.add("首夏犹清和,芳草亦未歇。");

poems.add("空山新雨后,天气晚来秋。");

poems.add("冬尽今宵促,年开明日长。");

poems.add("通过诗句可以看出,一年四季分明!!!");

Iteratorit=poems.iterator();

//获取Iterator迭代器对象

System.out.println("描写春夏秋冬的诗句:");

while(it.hasNext()){

//遍历集合并输出

Stringmovie=(String)it.next();

//将获取的Object元素强制转换为String类型

System.out.print(movie+"\t");

}

}

}9.1.6Set集合(4)在文本编辑器视图中,单击运行按钮,运行结果如图9-8所示。

提示:HashSet类添加元素顺序与遍历输出元素顺序不同。Iterator集合可用于所有集合遍历。如果向HashSet集合类添加两个相同的元素,只保留最后一次添加的元素,前面相同的元素将被覆盖。9.1.6Set集合2. TreeSet类TreeSet是Set集合的实现类之一,TreeSet类还实现了SortedSet集合,SortedSet集合是Set的子集合,实现了对集合的升序排序。TreeSet类实现了Comparable集合,Comparable集合提供了一个intcompareTo(Objectobj)方法用于比较两个对象的大小,如果两个对象相同,返回0;如果该对象大于指定对象,返回正整数;如果该对象小于指定对象,返回负整数。9.1.6Set集合实现Comparable集合类对象的比较方式见表9-8。表9-8实现Comparable集合类对象的比较方式类名比较方式数值类型包装类(BigDecimal、Biglnteger、Byte、Double、Float、Integer、Long及Short)按数值大小比较Character按字符的Unicode值的数字大小比较String按字符串中字符的Unicode值的数字大小比较TreeSet类除了实现了Collection集合的方法外,还有一些特有的方法见表9-9。表9-9TreeSet类的常用方法方法声明方法描述Objectfirst()返回集合中的第一个元素Objectlast()返回集合中的最后一个元素ObjectpoolFirst()移除集合中的第一个元素ObjectpoolLast()移除集合中的最后一个元素9.1.6Set集合【例9-6】通过TreeSet录入5名学生Java成绩,并将成绩升序排序输出,同时输出第一名和最后一名成绩。操作步骤:(1)在包.cvit.set下创建类TreeSetDemo。(2)在TreeSetDemo.java文件中,定义main()方法。(3)文本编辑器视图中,撰写代码如下:9.1.6Set集合package.cvit.set;

importjava.util.Scanner;

importjava.util.TreeSet;

/**

*TreeSet集合

*/

publicclassTreeSetDemo{

publicstaticvoidmain(String[]args){

TreeSetscores=newTreeSet();

//实例化TreeSet对象

Scannersc=newScanner(System.in);

//实例化Scanner对象

for(inti=1;i<=5;i++){

//循环输入5名同学成绩

System.out.print("请输入第"+i+"名同学的Java成绩:");

scores.add(sc.nextInt());

}

System.out.print("由低到高排名后的5名同学成绩:");

System.out.println(scores);

//输出集合内容

//分别输出集合中最后一个元素和第一个元素

System.out.println("本次Java测试中最高分为:"+scores.last());

System.out.print("本次Java测试中最低分为:"+scores.first());

}

}9.1.6Set集合(4)在文本编辑器视图中,单击运行按钮,运行结果如图9-9所示。

提示:

TreeSet集合类默认排序为升序。如果单纯输出集合所有元素,在输出项中直接给出集合对象名称即可。9.1.6Set集合9.1知识储备–Map集合

HashMap类TreeMap类双列集合Map用于存储具有映射关系的数据。Map集合中的元素以键值对(key-value)形式存储,即一个键对象(key)对应一个值对象(value),键对象不能相同,值对象可以相同,即同一个Map对象中的任意两个键对象通过equals()方法比较总是返回false。Map集合中的键对象和值对象之间存在单向一对一关系,即通过指定的键对象,总能找到唯一的、确定的值对象。9.1.7Map集合Map集合提供了大量的方法,常用的方法见表9-10。表9-10Map集合常用方法方法声明方法描述voidclear()删除Map集合中的所有键-值对Objectput(Kkey,Vvalue)把指定的键和值添加到Map集合中Objectget(Objectkey)返回Map集合中指定键对象所对应的值Objectremove(Objectkey)删除指定键对应的集合元素,返回被删除元素的值Booleanremove(Objectkey,Objectvalue)删除指定键和值的集合元素booleancontainKey(Objectkey)判断集合中是否有指定键Set<K>keySet()获取Map集合中所有的键,存储到Set集合中Set<Map.Entry<K,V>>entrySet()获取Map集合中所有键值对对象的Set集合booleanisEmpty()查询该Map集合是否为空intsize()返回Map集合元素的个数Collectionvalues()返回Map集合中所有值组成的Collection集合9.1.7Map集合Map集合常用实现类有HashMap集合和TreeMap集合,HashMap集合按照Hash算法来存储元素,而TreeMap集合按照键对象对元素进行排序。1.HashMap集合HashMap集合是Map集合常用实现类,HashMap集合根据键对象的hashCode值存储元素,根据键对象直接获取值对象,具有很快的获取速度。HashMap集合中的键对象和值对象是无序的,键对象不可重复,值对象可以重复,最多只允许一个集合元素的键对象为null,允许多个集合元素的值对象为null。HashMap集合常用构造方法如表9-11所示。表9-10Map集合常用方法构造方法声明构造方法描述HashMap()构造一个HashMap集合HashMap(intinitialCapacity)构造一个指定初始容量的HashMap集合9.1.7Map集合【例9-7】使用HashSet存储3名同学的学号和姓名信息,并遍历输出学号和姓名键值对。操作步骤:(1)在工程的src目录下创建包.cvit.map,在包.cvit.map下创建类HashMapDemo。(2)在HashMapDemo.java文件中,定义main()方法。(3)文本编辑器视图中,撰写代码如下:9.1.7Map集合package.cvit.map;

importjava.util.HashMap;

importjava.util.Set;

/**

*HashMap集合

*/

publicclassHashMapDemo{

publicstaticvoidmain(String[]args){

HashMapmap=newHashMap();

//实例化HashMap集合对象

map.put("22571301","周全");

//向集合添加3个键值对元素

map.put("22571302","赵楠");

map.put("22571303","郑旭");

Setkeys=map.keySet();

//通过集合的keySet()方法获取所有的键对象

System.out.println("学生信息Map遍历结果如下:");

for(Objectkey:keys){

//遍历键set集合

System.out.println(key+":"+map.get(key));

//通过集合get(key)方法获取键对应的值

}

}

}9.1.7Map集合(4)在文本编辑器视图中,单击运行按钮,运行结果如图9-10所示。

提示:HashSet遍历的结果与添加元素的顺序不同。通过Map集合的keySet()方法获取键,再通过Map集合的get(key)方法获取键对应的值。9.1.7Map集合【例9-8】利用Map集合的entrySet()方法遍历集合。操作步骤:(1)在包.cvit.map下创建类EntrySetDemo。(2)在EntrySetDemo.java文件中,定义main()方法。(3)文本编辑器视图中,撰写代码如下:9.1.7Map集合package.cvit.map;

importjava.util.HashMap;

importjava.util*;

/**

*entrySet()遍历Map集合

*/

publicclassEntrySetDemo{

publicstaticvoidmain(String[]args){

HashMapmap=newHashMap();

//实例化HashMap对象

map.put("百度","/");

//向HashMap集合对象添加元素

map.put("淘宝","/");

Setset=map.entrySet();

//通过entrySet()获取键值对的set集合

Iteratorit=set.iterator();

//获取set集合的迭代器对象

while(it.hasNext()){

//循环遍历set集合

Map.Entryentry=(Map.Entry)it.next();

//获取set集合中的下一个元素,并强转为Map.Entry类型

Objectkey=entry.getKey();

//通过entry对象的getKey()方法获取HashMap集合的键

Objectvalue=entry.getValue();

//通过entry对象的getValue()方法获取HashMap集合的值

System.out.println(key+":"+value);

}

}

}9.1.7Map集合(4)在文本编辑器视图中,单击运行按钮,运行结果如图9-11所示。

提示:Map.Entry是Map的一个内部集合,它表示Map中的一个实体(键值对),集合中有getKey()和getValue()方法,分别获取Map中的键和值。Map中的entrySet()方法返回一个Set对象,此对象的类型为Map.Entry。9.1.7Map集合2. TreeMap类TreeMap类是Map集合的实现类,它的底层与TreeSet相同,因此,可以对集合元素排序且不可重复。【例9-9】通过TreeMap添加多个元素,整型键,字符串型值,并遍历输出集合所有元素。操作步骤:(1)在包.cvit.map下创建类TreeMapDemo。(2)在TreeMapDemo.java文件中,定义main()方法。(3)文本编辑器视图中,撰写代码如下:9.1.7Map集合package.cvit.map;

importjava.util.*;

/**

*TreeMap集合

*/

publicclassTreeMapDemo{

publicstaticvoidmain(String[]args){

TreeMapmap=newTreeMap();

//实例化TreeMap集合对象

//向集合添加多个顺序无规律的元素,包括重复键的元素

map.put(5,"Tony");

map.put(2,"Alice");

map.put(1,"Tom");

map.put(3,"Adam");

map.put(4,"Joanne");

map.put(1,"Jack");

Setset=map.keySet();

//获取TreeMap集合对象所有键的set集合

Iteratorit=set.iterator();

System.out.println("遍历TreeMap集合所有元素如下:");

while(it.hasNext()){

Objectkey=it.next();

Objectvalue=map.get(key);

System.out.print(key+":"+value+"");

}

}

}9.1.7Map集合(4)在文本编辑器视图中,单击运行按钮,运行结果如图9-12所示。

提示:TreeMap遍历排序后的数据。本例中添加了两个键为1的元素,第2个覆盖了第一个,说明TreeMap无重复元素。9.1.7Map集合9.1知识储备–泛型泛型类泛型接口泛型方法Java中的集合可以存储任何类型对象,对象存入集合后,其类型信息将丢失,获取到的元素均为Object类型。这种设计会带来两个问题,一是同一个集合中可能会有多不同类型的元素,例如创建一个保存Student对象的集合中,同样可以将Teacher类对象“丢”进去,这样易出现异常;二是在获取集合元素时,需要通过强制类型转换将元素还原为最初类型,这些强制类型转换增加了程序的复杂度,同时容易引起类型转换异常。为了解决这些隐患,Java1.5之后Java提供了泛型,泛型可以在编译的时候检查类型安全,并且所有的强制转换都是自动和隐式的,提高了代码的重用率。泛型的本质是参数化类型,也就是给类型指定一个参数,然后在使用时再指定此参数具体的值,这样类型就可以在使用时决定了。这种参数类型可以用在类、接口和方法中,分别被称为泛型类、泛型接口、泛型方法。9.1.8泛型1.泛型类泛型类是一种可以接受任意类型参数的类。泛型类定义的一般格式:publicclass类名<T>T为泛型类型,可以是任意引用类型,亦可以有多个,多个类型之间用逗号分隔。定义好泛型后,需要创建泛型对象,创建泛型对象的一般格式:类名称<T>对象名称=new类名称<T>();例如:ArrayList<Integer>list=newArrayList<Integer>();其中,list对象元素泛型参数为整型,若存入其它类型元素,编译将报错。9.1.8泛型2.泛型接口泛型接口是一种可以接受任意类型参数的接口。泛型接口定义的一般格式:publicinterface接口名<T>3.泛型方法泛型方法是在调用方法的时候指明泛型的具体类型,泛型方法定义的一般格式:public<T>返回值类型方法名称(Tt){

方法体代码块}其中,形参数据类型为指定的泛型。9.1.8泛型【例9-10】创建一个ArrayList,要求使用泛型限定集合元素类型为Student。操作步骤:(1)在工程的src目录下创建包.cvit.type,在包.cvit.type下创建类Student类。(2)Student.java文件中撰写代码如下:9.1.8泛型package.cvit.type;

/**

*Student学生类

*/

publicclassStudent{

privateStringid;//学号

privateStringname;//姓名

privatefloatscore;//成绩

//创建有参构造方法

publicStudent(Stringid,Stringname,floatscore){

this.id=id;

this.name=name;

this.score=score;

}

publicStringgetId(){

returnid;

}

publicvoidsetId(Stringid){

this.id=id;

}

…………

publicStringgetName(){

returnname;

}

publicvoidsetName(Stringname){

this.name=name;

}

publicfloatgetScore(){

returnscore;

}

publicvoidsetScore(floatscore){

this.score=score;

}

@Override

publicStringtoString(){//重写toString()方法

return"Student{"+

"id='"+id+'\''+

",name='"+name+'\''+

",score="+score+

'}';

}

}9.1.8泛型package.cvit.type;

importjava.util.ArrayList;

/**

*泛型在List中的应用

*/

publicclassListDemo{

publicstaticvoidmain(String[]args){

ArrayList<Student>list=newArrayList<Student>();

//将ArrayList集合的泛型参数设置为Student类

list.add(newStudent("0001","Tony",98.2f));

//分别向list集合中添加3名学生信息

list.add(newStudent("0002","Alice",76.5f));

list.add(newStudent("0003","Tom",88.6f));

for(Studentstudent:list){

//遍历集合

System.out.println(student);

}

}

}(3)在包.cvit.type下创建测试类ListDemo。(4)在ListDemo.java文件中撰写代码如下:9.1.8泛型(4)在文本编辑器视图中,单击运行按钮,运行结果如图9-13所示。

提示:本例中的泛型类型为Student,需要注意在实例化ArrayList集合对象时,Student泛型参数出现的两处位置。有了泛型的集合元素类型将被锁定,不能添加其它类型到集合中。9.1.8泛型【例9-11】通过泛型参数的Map集合,将例9-10的Student类添加入TreeMap集合中。操作步骤:(1)在包.cvit.type下创建类MapDemo。(2)在MapDemo.java文件中,定义main()方法。(3)文本编辑器视图中,撰写代码如下:9.1.8泛型package.cvit.type;

importjava.util.*;

/**

*泛型在Map中的应用

*/

publicclassMapDemo{

publicstaticvoidmain(String[]args){

TreeMap<Integer,Student>map=newTr

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论