版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
学习目标掌握ArrayList、LinkedList单列集合学会用Iterator迭代器及foreach循环对集合遍历的编程方法主要内容ArrayList集合LinkedList集合Iterator迭代器foreach循环泛型List接口继承自Collection接口,通常将实现了List接口的对象称为List集合。在List集合中元素的存入顺序和取出顺序一致,允许出现重复的元素,所有的元素以一种线性方式进行存储。在程序中可以通过索引来访问集合中的指定元素。List不但继承了Collection接口中的全部方法,还增加了一些根据元素索引来操作集合的特有方法,如表7-2所示。
返回类型方法声明功能描述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(不包括)处所有元素集合组成的子集合表7-2List集合常用方法表7.2.1ArrayList集合ArrayList是List接口的一个实现类,每个ArrayList实例都有一个容量。该容量是指用来存储列表元素的数组的大小。随着向ArrayList中不断添加元素,其容量也自动增长。因此ArrayList集合可以看作是一个大小可变的数组。ArrayList集合继承了父类Collection和List中大部分的方法,其中add()方法和get()方法用于实现元素的存取。
7.2.1ArrayList集合
【例7-1】ArrayList集合使用importjava.util.*;publicclassEx7_1{ publicstaticvoidmain(String[]args){
ArrayListalist=newArrayList();//创建ArrayList集合
ArrayListblist=newArrayList();
alist.add("a1");//向集合中添加元素
alist.add("a2"); alist.add("a3"); blist.add("b1"); blist.add("b2");
System.out.println("1)alist:"+alist); //输出集合元素
alist.addAll(1,blist); //将blist添加到alist System.out.println("2)alist:"+alist); alist.remove(2); //删除索引为2的元素
alist.set(3,"c1"); //替换索引为3的元素
//输出集合元素及其长度
System.out.println("3)alist:"+alist+"长度:"+alist.size()); //输出指定范围的元素
System.out.println("索引1至2的子集合是:"+alist.subList(1,3)); }}7.2.2LinkedList集合LinkedList是List接口的另一个实现类,它克服了ArrayList集合在增删元素时效率较低的缺点。该集合内部采用一个双向循环链表,链表中的每一个元素都通过引用的方式来连接它的前一个元素(即前驱)和后一个元素(即后继)。当插入一个新元素时只需要修改元素之间的这种引用关系即可,删除一个结点也是如此。正因为这样的存储结构,所以LinkedList集合对于元素的增删操作具有很高的效率。图7-5LinkedList集合增删元素过程示意图7.2.2LinkedList集合
7.2.2LinkedList集合
返回类型方法声明功能描述voidadd(intindex,Eelement)将元素element添加到列表中的index处voidaddFirst(Objecto)将指定元素添加到此列表的开头voidaddLast(Objecto)将指定元素添加到此列表的结尾ObjectgetFirst()返回此列表的第一个元素ObjectgetLast()返回此列表的最后一个元素ObjectremoveFirst()移除并返回此列表的第一个元素ObjectremoveLast()移除并返回此列表的最后一个元素表7-3LinkedList集合常用方法表
【例7-2】LinkedList集合的使用importjava.util.*;publicclassEx7_2{ publicstaticvoidmain(String[]args){
LinkedListlink=newLinkedList();//创建LinkedList集合
link.add("a"); link.add("b"); link.add("c"); link.add("d");
System.out.println(link.toString());//取出并打印该集合中的元素
link.add(3,"e");//向该集合中指定位置插入元素
link.addFirst("f");//向该集合第一个位置插入元素
System.out.println(link);
System.out.println(link.getFirst());//取出该集合中第一个元素
System.out.println(link.getLast());//取出该集合中最后一个元素
link.remove(3);//移除该集合中指定位置的元素
link.removeLast();//移除该集合中第一个元素
System.out.println(link); }}7.2.2LinkedList集合
7.2.3Iterator迭代器Iterator是用于对集合进行迭代的迭代器接口。“迭代”是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。在程序开发中,经常需要遍历集合中的所有元素。Iterator主要用于迭代访问(即遍历)集合中的元素。7.2.3Iterator迭代器
返回类型方法声明功能描述booleanhasNext()如果仍有元素可以迭代,则返回
trueObjectnext()返回迭代的下一个元素voidremove()从集合中移除next方法返回的最后一个元素(可选操作)表7-4Iterator常用方法表
【例7-3】Iterator迭代器遍历集合importjava.util.*;publicclassEx7_3{ publicstaticvoidmain(String[]args){ ArrayListbooks=newArrayList();//创建ArrayList集合
books.add("Java程序设计"); books.add("操作系统"); books.add("计算机导论"); books.add("数据结构"); books.add("计算机导论"); Iteratorit=books.iterator();//获得Iterator对象
while(it.hasNext()){//判断该集合是否有下一个元素
Objectbk=it.next();//获取该集合中的元素
if("计算机导论".equals(bk)){//判断该元素是否为"计算机导论" it.remove();//删除该集合中的元素
} } System.out.println(books); }}7.2.3Iterator迭代器
7.2.3Iterator迭代器Iterator迭代器对象在遍历集合时,用指针指向集合中的元素,下面通过一个图例来描述Iterator对象迭代元素的过程,如图所示7.2.4foreach循环foreach循环用于遍历数组或集合中的元素,是for循环的特殊简化版本,但是并不能完全取代for循环,任何的foreach循环都可以改写为for循环。其具体语法格式如下: for(容器中元素类型临时变量:容器对象){
执行语句 }7.2.4foreach循环从上面的格式可以看出,与for循环相比,foreach循环不需要获得容器的长度,也不需要根据索引访问容器中的元素;与Iterator相比,foreach循环无需调用hasNext()和next()方法,它会自动遍历容器中的每个元素。接下来通过一个案例对foreach循环进行详细讲解。77.2.4foreach循环【例7-4】使用foreach循环遍历数组和集合importjava.util.ArrayList;publicclassEx7_4{ publicstaticvoidmain(String[]args){
intarr[]={2,3,1}; //创建数组arr ArrayListalist=newArrayList();//创建ArrayList集合
alist.add("a1"); //向ArrayList集合中添加字符串元素
alist.add("a2"); alist.add("a3"); for(intx:arr){ //使用foreach循环遍历数组元素
System.out.println(x); //输出数组元素
}
for(Objecto:alist){//使用foreach循环遍历ArrayList对象
System.out.println(o); //输出集合元素
} }}7.2.4foreach循环
【例7-5】使用for循环遍历并修改集合或数组元素publicclassEx7_5{ staticString[]strs={"Jack","Lucy","Tom"}; publicstaticvoidmain(String[]args){ //foreach循环遍历数组,不能修改元素值
for(Stringstr:strs){ str="Rose"; } System.out.println("foreach循环修改后的数组:"+strs[0]+","+strs[1]+","+strs[2]); //for循环遍历数组,可以修改元素值
for(inti=0;i<strs.length;i++){ strs[i]="Rose"; } System.out.println("普通for循环修改后的数组:"+strs[0]+","+strs[1]+","+strs[2]); }}7.2.5泛型1.什么是泛型首先,我们来看一个例子,了解什么是泛型,以及为什么要使用泛型。7.2.5泛型
【例7-6】不使用泛型的集合操作importjava.util.*;publicclassEx7_6{ publicstaticvoidmain(String[]args){ ArrayListalist=newArrayList(); //创建ArrayList集合
alist.add("Adam"); //添加字符串对象
alist.add("Eve"); alist.add(1); //添加Integer对象
for(Objectobj:alist){ //遍历集合
//强制转换成String类型并输出 System.out.println((String)obj); } }}7.2.5泛型上面这个例子主要反映出两个问题:(1)将一个对象存入集合中,集合不会记住此对象的类型,当再次从集合中取出此对象时,该对象的编译类型变成了Object类型,但其运行时,对象依然为其本身类型。(2)在取出元素时,如果需要人为的强制类型转换到具体的目标类型,就很容易出现“java.lang.ClassCastException”异常。接下来对例7-6中的第5行代码进行修改,如下所示:7.2.5泛型
为了解决上述问题,在定义集合类时,使用“<参数化类型>”即泛型,它可以指定类中方法操作的数据类型。对本例中的ArrayList集合,具体格式如下:图7-13例7-6修改后运行结果上面这种写法就限定了ArrayList集合只能存储String类型元素,将改写后的程序再次编译,程序在编译时就会出现错误提示,如图7-13所示。7.2.5泛型7.2.5泛型
【例7-7】使用泛型的集合操作importjava.util.ArrayList;publicclassEx7_7{ publicstaticvoidmain(String[]args){ //创建ArrayList集合,使用泛型 ArrayList<String>alist=newArrayList<String>();
alist.add("Adam");//添加字符串对象
alist.add("Eve"); //alist.add(1); //编译出错,不能添加Integer对象
for(Stringstr:alist){//遍历集合
System.out.println(str); } }}7.2.5泛型2.自定义泛型通过前面的学习,大家已经明白了泛型的具体运作过程。其实类和方法都可以自定义泛型。那么什么情况下我们需要自定义泛型类和泛型方法呢?下面通过一个例子来演示这种情况,如例7-8所示。
7.2.5泛型【例7-8】不使用自定义泛型类的程序classContainer{//创建Container类
privateObjectn; publicContainer(Objectn){//有参构造函数
this.n=n; } publicObjectget(){//定义一个get()方法用于获取数据
returnn; }}publicclassEx7_8{ publicstaticvoidmain(String[]args){ Containerbox=newContainer(10);//创建Container对象
Integern=box.get();//取出数据
System.out.println(n); }}7.2.5泛型从运行结果可以看出,程序在编译时就报错,这是因为第12行代码创建Container类对象时,存入了一个整型数10,第13行代码取出这个数据时,将该数据赋值给Integer类型的变量n,出现了类型不匹配的错误。为了解决这个问题,就可以使用自定义泛型。如果在定义一个类Container时使用<T>声明参数类型(T、E、K、V等形式的参数常用于表示泛型形参),将成员变量、构造方法的参数类型和get()方法的返回值类型都声明为T,这就限定了存入元素的类型,容器中只能存入类型为T的元素。7.2.5泛型
【例7-9】使用自定义泛型类的程序classContainer<T>{//创建Container类
privateTn; publicContainer(Tn){//有参构造函数
this.n=n; } publicTget(){//定义一个get()方法用于获取数据
returnn; }}publicclassEx7_9{ publicstaticvoidmain(String[]args){ Container<Integer>box=newContainer<Integer>(10);//创建Container对象
Integern=box.get();//取出数据
System.out.println(n); }}【案例7-1】图书查询程序设计案例描述同学们去图书馆借阅,都会先查询一下是否有自己想要的图书。本案例要求使用所学知识编写一个图书查询程序。该程序通过输入数字1或2,选择不同的功能:“1”—可以显示所有图书名称;“2”—可以根据读者输入的图书名称查询图书馆是否有这本书,如果有,提示此图书存在,否则提示此图书不存在。【案例7-1】图书查询程序设计程序运行结果如图7-17、图7-18
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 防灾自救必修课:初中生“火海逃生”消防安全主题班会教案(2026春季学期七年级)
- 2026届江苏省南通市通州区金沙中学高三下学期一模考试历史试题(含答案)
- 医院反恐防暴应急处置实战预案
- 2026届高三备考参考:精准把握新高考方向家校协同科学备考
- 《道德与法治》八年级“同守护 共成长”校园安全实践教学设计
- 贲门癌术后心理调适与支持
- 2026年保险从业资格考试重点预测题
- 2026年会计招聘笔试模拟题含答案解析
- 2026年冬季安全知识幼儿园主题班会
- 2026年事业编考会计基础知识
- 门诊常见传染病预防
- 2026年国家心理咨询师职业资格考试真题(含答案)
- 2026四川甘孜州巴塘县考调事业单位工作人员18人重点基础提升(共500题)附带答案详解
- 西门子阀门定位器中文说明书
- 围手术期液体管理
- 2026年广东深圳市高三二模高考语文试卷试题(含答案)
- 基层老年痴呆防治管理指南(2025版)
- 2026河南三支一扶考试押题
- 2026年沈阳水务集团有限公司校园招聘笔试备考试题及答案解析
- YY/T 1992-2025采用机器人技术的辅助手术设备总结性可用性测试方法
- 广东省2026届高三下学期普通高等学校招生全国统一考试模拟测试(一)地理试卷(含答案)
评论
0/150
提交评论