集合(3):Collection下的子接口:List接口
一、List接口的概述
(1)有序集合(有序指的是存储和取出的顺序一致)
(2)允许重复的元素
(3)此接口的用户可以对列表中每个元素的插入位置进行精确地控制。用户可以根据元素的整数索引(在列表中的位置)访问元素,并搜索列表中的元素
创建List集合对象,使用接口多态的形式创建(ArrayList是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循环遍历集合中的暗元素
while (iterator.hasNext()) {
Object next = iterator.next();
//向下转型
String s = (String) next;
System.out.println(s + ",长度为:" + s.length());
}
}
}
二、List接口特有的功能
1、因为List集合拥有下标索引,所以根据这个下标索引衍生出特有方法
(1)添加功能:
void add(int index,Object element)
将指定的元素插入此列表中的指定位置
(2)删除功能:
Object remove(int index)
删除该列表中指定位置的元素
(3)获取功能:
Object get(int index)
返回此列表中指定位置的元素
(4)修改功能:
Object set(int index,Object element)
用指定的元素替换此列表中指定位置的元素
(5)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() ),size代表元素的个数
list.add(0, "hive");
System.out.println(list);//[hive, hello, world, java, hadoop]
list.add(5, "spark");
System.out.println(list);//[hive, hello, world, java, hadoop, spark]
//Object remove(int index)
//删除该列表中指定位置的元素
//返回被删除的元素,类型为Object类型
Object obj = list.remove(0);
System.out.println(obj);//hive
System.out.println(list);//[hello, world, java, hadoop, spark]
//Object get(int index)
//获取此列表中指定位置的元素
//原集合中的元素不变
Object obj2 = list.get(3);
System.out.println(obj2);//hadoop
System.out.println(list);//[hello, world, java, hadoop, spark]
//Object set(int index,Object element)
//用指定的元素(可选操作)替换此列表中指定位置的元素。
//返回的是指定位置被替换的元素
Object obj3 = list.set(3, "flink");
System.out.println(obj3);//hadoop
System.out.println(list);//[hello, world, java, flink, spark]
//获取List迭代器对象,遍历
Iterator iterator = list.iterator();
while (iterator.hasNext()) {
String s = (String) iterator.next();
System.out.println(s + ",长度为:" + s.length());
/*
hello,长度为:5
world,长度为:5
java,长度为:4
flink,长度为:5
spark,长度为:5
*/
}
}
}
2、List集合特有的迭代器
(1)ListIterator extends Iterator
由于继承自Iterator接口,所以内部一定也有hasNext()方法和next()方法
(2)获取功能:Object previous():返回列表中的上一个元素,并向后移动光标位置
(当指针指向某一位置,调用该方法,指针就会指向上一位置)
可以反复调用此方法以向后方遍历列表,或者与调用next()进行混合来回。
(请注意,对next和previous交替调用将next返回相同的元素。)
1、该方法是倒着遍历迭代器
2、该方法的获取元素指针与next()获取元素指针是同一个
(3)判断功能:boolean hasPrevious():判断上一个有没有元素
注意:
要想倒着遍历,必须先正着遍历一遍。在开发中很少使用,面试中经常遇到
案例:
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
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");
//获取List迭代器对象 list.listIterator().var
ListIterator listIterator = list.listIterator();
/*
像之前一样遍历是错误的,因为previous()方法是倒着遍历的
但是指针一开始是在第一个位置前面
我们需要将指针移动到最后一个元素的位置后面
错误案例:
while (listIterator.hasPrevious()) {
Object previous = listIterator.previous();
String s = (String) previous;
System.out.println(s + ",长度为:" + s.length());
}
*/
//先将指针移动到最后一个元素的位置后面
//先正着遍历一遍,使用hasNext()判断
while (listIterator.hasNext()){
//获取集合中的下一个元素
Object next = listIterator.next();
//向下转型
String s = (String) next;
System.out.println(s + ",长度为:" + s.length());
}
//然后再倒着遍历,使用hasPrevious()判断
while (listIterator.hasPrevious()){
//获取集合中的上一个元素
Object previous = listIterator.previous();
//向下转型
String s = (String) previous;
System.out.println(s + ",长度为:" + s.length());
}
}
}
3、List集合特有的遍历方式(仅限于List集合)
size()方法和get()方法的结合使用
size()方法:获取集合的长度
get()方法:获取结合的元素
遍历List集合元素
import java.util.ArrayList;
import java.util.List;
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());
}
}
}
执行结果如下:
hello,长度为:5
world,长度为:5
java,长度为:4
hadoop,长度为:6
hadoop,长度为:6
java,长度为:4
world,长度为:5
hello,长度为:5
Process finished with exit code 0
遍历学生对象信息
import java.util.ArrayList;
import java.util.List;
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());
}
}
}