List接口
程序引例
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/*
Collection下的子接口:List
有序集合(有序指的是存储和取出的顺序一致)--有索引
允许重复的元素
*/
public class ListDemo1 {
public static void main(String[] args) {
//创建List集合对象,使用接口多态的形式创建
List list = new ArrayList();
list.add("hello");
list.add("world");
list.add("java");
list.add("bigdata");
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
Object next = iterator.next();
//向下转型
String s = (String) next;
System.out.println(s + ",长度为:" + s.length());
}
}
}
List相关集合特有的功能
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/*
List相关集合特有的功能
因为List集合拥有下标索引,所以根据这个下标索引衍生出特有方法
添加功能:
void add(int index,Object element)
将指定的元素插入此列表中的指定位置(可选操作)。
删除功能:
Object remove(int index)
删除该列表中指定位置的元素(可选操作)。
获取功能:
Object get(int index)
返回此列表中指定位置的元素。
修改功能:
Object set(int index,Object element)
用指定的元素(可选操作)替换此列表中指定位置的元素。
List特有迭代器:
ListIterator<E> listIterator()
返回列表中的列表迭代器(按适当的顺序)。
*/
public class ListDemo2 {
public static void main(String[] args) {
//创建List集合对象
List list = new ArrayList();
//添加元素到集合中
list.add("hello");
list.add("world");
list.add("java");
list.add("hadoop");
System.out.println(list);//[hello,world,java,hadoop]
System.out.println("===============================");
//void add(int index,Object element)
//将指定的元素插入此列表中的指定位置(可选操作)。
//如果指数超出范围( index < 0 || index > size() )
list.add(0, "hive");
System.out.println(list);//[hive,hello,world,java,hadoop]
//index > size()报错,5刚刚好是size,所以不报错。
list.add(5, "spark");
System.out.println(list);//[hive,hello,world,java,hadoop,spark]
//编译没报错,运行报错了。
//IndexOutOfBoundsException: Index: 7, Size: 6
// list.add(7, "flink");
// System.out.println(list);
System.out.println("********************************");
//Object remove(int index)
//删除该列表中指定位置的元素(可选操作)。
//返回被删除的元素,类型为Object类型
Object obj = list.remove(0);
System.out.println(obj);
System.out.println(list);
System.out.println("******************************");
//Object get(int index)
//返回此列表中指定位置的元素。
//不改变原集合中的元素
Object obj2 = list.get(3);
System.out.println(obj2);
System.out.println(list);//
System.out.println("******************************");
//Object set(int index,Object element)
//用指定的元素(可选操作)替换此列表中指定位置的元素。
//返回的是指定位置被替换的元素
Object obj3 = list.set(3, "flink");
System.out.println(obj3);
System.out.println(list);
System.out.println("******************************");
//获取迭代器对象
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
String s = (String) iterator.next();
System.out.println(s + ",长度为:" + s.length());
}
}
}
List集合特有的迭代器:ListIterator extends Iterator
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
/*
List集合特有的迭代器:
ListIterator extends Iterator
由于继承自Iterator接口,所以内部一定也有hasNext()方法和next()方法
Object previous()返回列表中的上一个元素,并向后移动光标位置。
可以反复调用此方法以向后方遍历列表,或者与调用next()进行混合来回。
(请注意,对next和previous交替调用将next返回相同的元素。)
1、该方法是倒着遍历迭代器
2、该方法的获取元素指针与next()获取元素指针是同一个
boolean hasPrevious()返回true如果遍历反向列表,列表迭代器有多个元素。
(换句话说,如果previous()将返回一个元素而不是抛出异常,则返回true )。
注意:
要想倒着遍历,必须先正着遍历一遍。在开发中很少使用,面试中经常遇到。
*/
public class ListIteratorDemo1 {
public static void main(String[] args) {
//创建集合对象
List list = new ArrayList();
//添加元素
list.add("hello");
list.add("world");
list.add("java");
list.add("hadoop");
ListIterator listIterator = list.listIterator();
// while (listIterator.hasPrevious()) {
// Object previous = listIterator.previous();
// String s = (String) previous;
// System.out.println(s + ",长度为:" + s.length());
// }
//NoSuchElementException
//迭代器一开始的时候指针在第一个位置之前
//所以调用previous()方法获取前一个元素,会报错
// Object previous = listIterator.previous();
// String s = (String) previous;
// System.out.println(s + ",长度为:" + s.length());
//先将指针移动到最后一个元素的位置后面
//先正着遍历一遍
System.out.println("正着遍历:");
while (listIterator.hasNext()){
Object next = listIterator.next();
String s = (String) next;
System.out.println(s + ",长度为:" + s.length());
}
System.out.println("************************************");
System.out.println("倒着遍历:");
//然后在倒着遍历
while (listIterator.hasPrevious()){
Object previous = listIterator.previous();
String s = (String) previous;
System.out.println(s + ",长度为:" + s.length());
}
}
}
List集合特有的遍历方式
import java.util.ArrayList;
import java.util.List;
/*
List集合特有的遍历方式:
size()方法和get()方法的结合使用
*/
public class ListDemo3 {
public static void main(String[] args) {
//创建集合对象
List list = new ArrayList();
//向集合中添加元素
list.add("hello");
list.add("world");
list.add("java");
list.add("bigdata");
//size()方法和get()方法的结合使用
for (int i = 0; i < list.size(); i++) {
Object obj = list.get(i);
//向下转型
String s = (String) obj;
System.out.println(s + ",长度为:" + s.length());
}
}
}
import java.util.ArrayList;
import java.util.List;
/*
List集合存储学生对象,使用size()和get()方法遍历
*/
public class ListDemo4 {
public static void main(String[] args) {
//创建集合对象
List list = new ArrayList();
//创建学生对象
Student s1 = new Student("王力宏", 45);
Student s2 = new Student("李元浩", 22);
Student s3 = new Student("智勋", 24);
Student s4 = new Student("呆妹", 22);
Student s5 = new Student("乌兹", 21);
//将学生对象添加到集合中
list.add(s1);
list.add(s2);
list.add(s3);
list.add(s4);
list.add(s5);
//使用size()和get()方法遍历
for (int i = 0; i < list.size(); i++) {
Student student = (Student) list.get(i);
System.out.println(student.getName() + "---" + student.getAge());
}
}
}
遍历中的并发修改异常
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
/*
需求:
现在有一个集合,集合中有些字符串的元素,我想判断一下里面有没有"bigdata"这个字符串
如果有,我们就添加一个"yes"
ConcurrentModificationException:并发修改异常
当不允许这样的修改时,可以通过检测到对象的并发修改的方法来抛出此异常。
原因:
迭代器是依赖于集合存在的,在遍历迭代器元素的时候,当我们判断成功后,往集合
中添加了一个元素,但是呢,迭代器这个时候并不知道已经添加了元素,所以就报错了。
简单描述为:在迭代器遍历的时候,不能通过集合去修改元素(两者的修改不是同步的)。
解决办法:
1、迭代器遍历的时候,通过List特有的迭代器对象调用add()方法向集合中添加元素
2、集合遍历的时候,修改集合中的元素
*/
public class ListQuestion {
public static void main(String[] args) {
//创建一个集合对象
List list = new ArrayList();
list.add("hello");
list.add("world");
list.add("java");
list.add("bigdata");
list.add("hadoop");
//-------------- ConcurrentModificationException:并发修改异常------------
//获取迭代器对象
// Iterator iterator = list.iterator();
// while (iterator.hasNext()){
// String s = (String) iterator.next();
// if("bigdata".equals(s)){
// ConcurrentModificationException:并发修改异常
// list.add("yes");
// }
// }
//------------迭代器遍历的时候,修改迭代器中的元素------------------
// ListIterator listIterator = list.listIterator();
// while (listIterator.hasNext()){
// String s = (String) listIterator.next();
// if("bigdata".equals(s)){
//迭代器是遍历集合的,添加不了元素
//此时listIterator调用的add()方法其实是调用List集合的add()方法
//在集合里面加上新的元素
// listIterator.add("yes");
// }
// }
//想要看到添加的结果,就要在遍历后输出List集合中的元素
// System.out.println(list);
//------------集合遍历的时候,修改集合中的元素------------------
for(int i=0;i<list.size();i++){
String s = (String) list.get(i);
if("bigdata".equals(s)){
list.add("yes"); //因为在List集合中没有指针的概念,所以在集合尾部添加
}
}
System.out.println(list);
}
}