一.介绍
List集合包括JavaList接口以及List接口的所有实现类.List集合中的元素允许重复,各元素的顺序放是对象插入的顺序.类似Java中的数组,用户可通过使用索引(元素在集合中的位置)来访问集合中的元素
二.知识点介绍
1、接口特点及主要子类
2、List集合存储数据的结构
3、List接口常用方法
三.上课对应视频的说明文档
1、接口特点及主要子类
单列集合、可存放重复元素、元素有序
主要子类
ArrayList:底层数据结构是数组结构。线程不安全的。所以ArrayList的出现替代了Vector。增删慢,查找快。
LinkedList:底层是链表数据结构。线程不安全的,同时对元素的增删快,查找慢。
Vector:底层数据结构是数组结构。jdk1.0版本。线程安全的。无论增删还是查询都非常慢,已被ArrayList替代。
2、List集合存储数据的结构
List接口下有很多个集合,它们存储元素所采用的结构方式是不同的,这样就导致了这些集合有它们各自的特点,供给我们在不同的环境下进行使用。数据存储的常用结构有:堆栈、队列、数组、链表。我们分别来了解一下:
堆栈,采用该结构的集合,对元素的存取有如下的特点:
先进后出(即,存进去的元素,要在后它后面的元素依次取出后,才能取出该元素)。例如,子弹压进弹夹,先压进去的子弹在下面,后压进去的子弹在上面,当开枪时,先弹出上面的子弹,然后才能弹出下面的子弹。
栈的入口、出口的都是栈的顶端位置
压栈:就是存元素。即,把元素存储到栈的顶端位置,栈中已有元素依次向栈底方向移动一个位置。
弹栈:就是取元素。即,把栈的顶端位置元素取出,栈中已有元素依次向栈顶方向移动一个位置。
队列,采用该结构的集合,对元素的存取有如下的特点:
先进先出(即,存进去的元素,要在后它前面的元素依次取出后,才能取出该元素)。例如,安检。排成一列,每个人依次检查,只有前面的人全部检查完毕后,才能排到当前的人进行检查。
队列的入口、出口各占一侧。例如,下图中的左侧为入口,右侧为出口。
数组,采用该结构的集合,对元素的存取有如下的特点:
查找元素快:通过索引,可以快速访问指定位置的元素
增删元素慢:
指定索引位置增加元素:需要创建一个新数组,将指定新元素存储在指定索引位置,再把原数组元素根据索引,复制到新数组对应索引的位置。如下图
指定索引位置删除元素:需要创建一个新数组,把原数组元素根据索引,复制到新数组对应索引的位置,原数组中指定索引位置元素不复制到新数组中。如下图
链表,采用该结构的集合,对元素的存取有如下的特点:
多个节点之间,通过地址进行连接。例如,多个人手拉手,每个人使用自己的右手拉住下个人的左手,依次类推,这样多个人就连在一起了。
查找元素慢:想查找某个元素,需要通过连接的节点,依次向后查找指定元素
增删元素快:
增加元素:操作如左图,只需要修改连接下个元素的地址即可。
删除元素:操作如右图,只需要修改连接下个元素的地址即可。
3、List接口常用方法
void add(int index, E element) //指定索引添加元素
E remove(int index) //移除指定索引处元素
E get(int index) //获取指定索引元素
E set(int index, E element) //修改指定索引元素
List
intindexOf(Object o) //返回指定元素索引位置
importjava.util.ArrayList;
importjava.util.List;
/*
* List 方法
*
* void add(int index, E element) //指定索引添加元素
*/
public class Demo {
public static void main(String[] args) {
//fun3();
//fun2();
//fun();
}
private static void fun3() {
List
al.add("111");// 添加 Collection中 继承来的
al.add("222");
al.add("333");
al.add("444");
System.out.println(al);
al.set(2, "6666");
System.out.println(al);
List
System.out.println(subList);
intindexOf = subList.indexOf("444");
System.out.println(indexOf);
}
private static void fun2() {
List
al.add(1);
al.add(2);
al.add(3);
al.add(4);
al.remove(2);
System.out.println(al);
}
private static void fun() {
List
al.add("111");// 添加 Collection中 继承来的
al.add("222");
al.add("333");
al.add("444");
al.add(2, "666");
al.add(5, "999");
al.add(6, "000999");
System.out.println(al);
al.remove(6);
System.out.println(al);
}
}
ListIterator
importjava.util.ArrayList;
importjava.util.Collection;
importjava.util.Iterator;
importjava.util.List;
importjava.util.ListIterator;
/*
* ListIterator : Iterator 子接口.
*
* Collection 是得不到ListIterator , 因为 List 专属的.
*
* add添加方法 比较常用.
*/
public class Demo2 {
public static void main(String[] args) {
//fun();
List c = new ArrayList<>();
c.add("孙悟空");
c.add("白骨精");
c.add("唐三藏");
c.add("八戒");
ListIterator li = c.listIterator();
while (li.hasNext()) {
Object object = (Object) li.next();
if (object.equals("白骨精")) {
li.add("白龙马");
}
}
System.out.println(c);
ListIteratorlistIterator = c.listIterator();
listIterator.next();
System.out.println(listIterator.hasPrevious());
}
private static void fun() {
Collection c = new ArrayList<>();
c.add("孙悟空");
c.add("白骨精");
c.add("唐三藏");
c.add("八戒");
//遍历 集合, 如果 包含 白骨精 ,你就添加一个 白龙马.
Iterator iterator = c.iterator();
while (iterator.hasNext()) {
Object object = (Object) iterator.next();
if (object.equals("白骨精")) {
c.add("白龙马"); //ConcurrentModificationException
}
}
System.out.println(c);
}
}