List集合:
list接口的概述、list接口的成员方法、成员方法的代码演示、列表迭代器、ListIterator、Iterator、并发修改异常。
1、List接口的概述
(1)List接口概述
A:List接口是有序的 collection(也称为序列),此处的有序,是指存储元素的顺序和取出元素的顺序一致。
B:此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素。
C:与 set 不同,List 列表通常允许重复的元素。
2、List接口的测试
(1)需求1
需求:List 集合中存储字符串,并且遍历输出。
(2)代码实现
package cn.itcast_01;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ListDemo {
public static void main(String[] args) {
// 创建集合对象
List list = new ArrayList();
// 创建字符串,并且添加进集合中
list.add("林青霞");
list.add("风清扬");
list.add("大孟");
list.add("风清扬");
list.add("大孟");
// 遍历集合
Iterator it = list.iterator();
while (it.hasNext()) {
String s = (String) it.next();
System.out.println(s);
}
}
}
(3)需求2
需求:List 集合中存储自定义对象,并且遍历输出。
(4)代码实现
//存储自定义对象
package cn.itcast_01;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ListDemo2 {
public static void main(String[] args) {
// 创建集合对象
List list = new ArrayList();
// 创建学生对象,并添加进集合
Student s1 = new Student("dawei", 11);
Student s2 = new Student("xiaowei", 10);
Student s3 = new Student("dameng", 13);
Student s4 = new Student("xiaomeng", 1);
list.add(s1);
list.add(s2);
list.add(s3);
list.add(s4);
// 遍历集合
Iterator it = list.iterator();
while (it.hasNext()) {
Student s = (Student)it.next();
System.out.println(s.getName() + "---" + s.getAge());
}
}
}
package cn.itcast_01;
public class Student {
//成员变量
private String name;
private int age;
//构造方法
public Student() {
super();
}
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
//成员方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//重写toString方法
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age + "]";
}
}
3、List接口的特有功能
(1)List集合的特有功能:
1)添加功能
void add(int index, Object element): 在指定位置上添加一个元素。
2)获取功能
Object get(int index): 获取指定位置上的元素。
3)列表功能
ListIterator listIterator( ): List集合特有的迭代器:列表迭代器。
4)删除功能
Object remove(int index): 根据索引删除元素,返回被删除的元素。
5)修改功能
Object set(int index, Object element): 根据索引修改元素,返回被修改的元素。
6)List集合的特殊的遍历功能:size()和get()方法结合起来。
(2)代码演示
package cn.itcast_02;
import java.util.ArrayList;
import java.util.List;
public class ListDemo {
public static void main(String[] args) {
// 创建集合对象
List list = new ArrayList();
// 添加元素
list.add("hello");
list.add("world");
list.add("java");
// void add(int index, Object element):在指定位置上添加一个元素。
list.add(1, "android"); // 没问题
// list.add(3, "android"); //没问题
// list.add(4, "android"); //出错:IndexOutOfBoundsException
// list.add(11, "android"); //出错:IndexOutOfBoundsException
// Object get(int index):获取指定位置上的元素。
System.out.println("get:" + list.get(1)); // get:android
// System.out.println("get:" + list.get(11)); // 出错:IndexOutOfBoundsException
// Object remove(int index):根据索引删除元素,返回被删除的元素。
System.out.println("remove:" + list.remove(2)); // remove:world
// System.out.println("remove:" + list.remove(11)); //
// 出错:IndexOutOfBoundsException
// Object set(int index, Object element):根据索引修改元素,返回被修改的元素。
System.out.println("set:" + list.set(2, "cmm")); // set:java
System.out.println("list:" + list); // list:[hello, android, cmm]
System.out.println("-------------");
// List集合的特殊的遍历功能:size()和get()方法结合起来。
for(int i=0; i<list.size(); i++) {
System.out.println(list.get(i));
}
}
}
(3)List集合的2中遍历方式(掌握!)
4、列表迭代器 ListIterator
ListIterator listIterator( ): List集合特有的迭代器。
该迭代器继承了Iterator迭代器,所以,它可以直接使用父接口Iterator的hasNext()和next()方法。
特有功能:
(1)object previous( ): 获取上一个元素。
(2)boolean hasPrevious( ): 判断是否有上一个元素。
注意:ListIterator可以实现集合的逆序遍历,但是必须先正向遍历让迭代器走到结合的末尾,再返回逆序遍历,所以,一般无意义,使用不多。ListIterator提供了比Iterator更多的方法,可以查看API文档。
5、面试题
(1)需求:
有一个集合,请问,想判断该集合中有没有元素"world",如果有,我就添加一个元素"JavaEE"进入该集合,请写出代码。
(2)出现的问题:
ConcurrentModificationException:当方法检测到对象的并发修改,但不允许这样时,抛出此异常。
(3)产生原因:
(迭代器遍历集合,集合修改集合元素)
迭代器是依据集合而存在的,在判断成功后,集合中新添加了元素,所以集合就不是原来的那个集合了,而迭代器还是原来的那个集合的迭代器,旧的迭代器和新的集合不匹配,所以报错了,这个错误叫做“并发修改异常”。
(4)如何解决呢?
A:迭代器迭代元素,迭代器修改元素。(新加的元素是添加在刚才迭代元素的后面的。)
B:集合遍历元素,集合修改元素(使用普通for循环)。(新加的元素是添加在集合末尾的。)
(5)代码演示:
package cn.itcast_03;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
public class ListIteratorDemo2 {
public static void main(String[] args) {
List list = new ArrayList();
list.add("cmm2");
list.add("world");
list.add("java");
list.add("hello");
// 方式1:迭代器迭代元素,迭代器修改元素。
ListIterator it = list.listIterator();
while (it.hasNext()) {
String s = (String) it.next();
if ("world".equals(s)) {
it.add("javaEE");
}
} // cmm2 world javaEE java hello
System.out.println("-------------");
// 方式2:迭代器迭代元素,迭代器修改元素。
for (int i = 0; i < list.size(); i++) {
String s = (String) list.get(i);
if ("world".equals(s)) {
list.add("javaEE2");
}
} // cmm2 world javaEE java hello javaEE2
System.out.println("-------------");
// 遍历集合
Iterator it0 = list.iterator();
while (it0.hasNext()) {
String s = (String) it0.next();
System.out.println(s);
}
}
}