List集合及List的专有迭代器 day12
package com.shujia.day12;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
/*
Collection的子接口:List
特点:有序且元素可以发生重复的集合,且有索引下标的概念。
*/
/*
List接口中特有的成员方法:(因为List集合有索引的概念,针对索引的操作多了一些方法)
void add(int index,E element) 指定位置索引添加元素到集合中
E remove(int index) 指定索引删除某个元素,返回被删除的元素
E get(int index) 根据索引获取集合中的元素对象
E set(int index,E element) 指定位置索引,修改元素,返回原本位置上的元素对象
ListIterator listIterator() List集合专有的迭代器
迭代器遍历的时候,无法使用集合的方法对集合本身做改动
List中特有的迭代器中的add方法,不仅可以对迭代器中元素进行添加,底层也针对原集合进行添加元素
将原集合以及迭代器的版本号也设置成一样的了,所以将来再检查版本号的时候,原集合和迭代器的版本号是一致的
这样就不会产生并发修改异常了
ListItr类中有hasPrevious()和previous()方法
hasPrevious(): 判断前一个位置上是否有元素
previous(): 将游标向前移动一位,并获取位置上的元素
ListItr类是继承自Itr类,也拥有hasNext()和next()方法
思考:
1、使用List集合存储字符串元素,使用迭代器遍历,遍历的时候,如果遇到"java",就向集合中添加一个元素"shujia"
2、数据结构
*/
public class ListDemo2 {
public static void main(String[] args) {
//创建一个List集合对象
List li1 = new ArrayList();
//创建元素对象
Student s1 = new Student("aaa", 12);
Student s2 = new Student("bbb", 13);
Student s3 = new Student("ccc", 14);
Student s4 = new Student("fff", 15);
//将元素添加到List集合中
li1.add(s1);
li1.add(s2);
li1.add(s3);
li1.add(s4);
System.out.println("li1: "+li1);
System.out.println("=======================================");
//void add(int index,Object element) 指定位置索引添加元素到集合中
Student s5 = new Student("qqq", 18);
//需求:将s5添加在s2和s3之间
li1.add(2,s5);
Student s6 = new Student("zzz", 20);
li1.add(5,s6); // 紧跟着最后一个元素后面的索引可以赋值,其他的索引不行
System.out.println("li1: "+li1);
// System.out.println("=======================================");
//E remove(int index) 指定索引删除某个元素,返回被删除的元素
// Object o = li1.remove(2);
// System.out.println("li1: "+li1);
// System.out.println("o: "+o);
System.out.println("=======================================");
//Object get(int index) 根据索引获取集合中的元素对象
Object o = li1.get(2);
System.out.println("li1: "+li1);
System.out.println(o);
System.out.println("=======================================");
//Object set(int index,Object element) 指定位置索引,修改元素,返回原本位置上的元素对象
Student s7 = new Student("www", 31);
Object o2 = li1.set(2, s7);
System.out.println("li1: "+li1);
System.out.println("o2: "+o2);
System.out.println("=======================================");
//一个迭代器对象只有一个游标可以移动
//ListIterator listIterator() List集合专有的迭代器
//listIterator()通过观察子类源码发现,底层是返回了一个ListItr类的对象
//ListItr类是继承自Itr类,也拥有hasNext()和next()方法
ListIterator listIterator = li1.listIterator();
while (listIterator.hasNext()){
Object o1 = listIterator.next();
System.out.println(o1);
}
System.out.println("__________________________________________");
//ListItr类中有hasPrevious()和previous()方法
//hasPrevious(): 判断前一个位置上是否有元素
//previous(): 将游标向前移动一位,并获取位置上的元素
//要想倒着遍历,必选先将迭代器的游标移动到最后一位。
while (listIterator.hasPrevious()){
Object o3 = listIterator.previous();
System.out.println(o3);
}
}
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现