List接口
概述
java.util.List
接口继承自Collection
接口,是单列集合的一个重要分支,习惯性地会将实现了List
接口的对象称为List集合。在List集合中允许出现重复的元素,所有的元素是以一种线性方式进行存储的,在程序中可以通过索引来访问集合中的指定元素。另外,List集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。
特点
- 它是一个元素存取有序的集合。元素的存入顺序和取出顺序一致。
- 它是一个带有索引的集合,通过索引就可以精确的操作集合中的元素(与数组的索引是一个道理)。
- 集合中可以有重复的元素,通过元素的equals方法,来比较是否为重复的元素。
List接口的子类java.util.ArrayList类,该类中的方法都是来自List中定义。
常用方法
List作为Collection集合的子接口,不但继承了Collection接口中的全部方法,而且还增加了一些根据元素索引来操作集合的特有方法,如下:
public void add(int index, E element)
: 将指定的元素,添加到该集合中的指定位置上。public E get(int index)
:返回集合中指定位置的元素。public E remove(int index)
: 移除列表中指定位置的元素, 返回的是被移除的元素。public E set(int index, E element)
:用指定元素替换集合中指定位置的元素,返回值的更新前的元素。
注意
List集合所有的方法都是跟索引相关,操作索引的时候,一定要防止索引越界异常
IndexOutOfBoundsException
:索引越界异常,集合会报ArrayIndexOutOfBoundsException
:数组索引越界异常StringIndexOutOfBoundsException
:字符串索引越界异常
代码:
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Demo01List {
public static void main(String[] args) {
// 创建一个List集合对象,多态
List<String> list = new ArrayList<>();
// 使用add方法往集合添加元素
list.add("a");
list.add("b");
list.add("c");
list.add("a");
list.add("d");
// 打印集合
//System.out.println(list); // [a, b, c, a, d] 重写了toString方法
// 添加
list.add(3,"itheima");
//System.out.println(list); //[a, b, c, itheima, a, d]
// 获取
String r = list.get(10); // IndexOutOfBoundsException: 数组索引越界异常
// 移除
String removeE = list.remove(2);
System.out.println("被移除的元素:" + removeE); // 被移除的元素:c
//System.out.println(list); // [a, b, itheima, a, d]
// 替换
String setE = list.set(4, "A");
System.out.println("被替换的元素:" + setE); // 被替换的元素:d
//System.out.println(list); // [a, b, itheima, a, A]
}
}
结果:
被移除的元素:c
被替换的元素:d
遍历的三种方式
- for循环
- 迭代器
- 增强for循环(迭代器简化版)
代码:
// 1. for循环
for (int i = 0; i < list.size(); i++) {
String s = list.get(i);
System.out.print(s +"\t");
}
System.out.println("\n" + "======================");
// 2. 迭代器
Iterator<String> it = list.iterator();
while (it.hasNext()) {
String s = it.next();
System.out.print(s +"\t");
}
System.out.println("\n" + "======================");
// 3. 增强for循环(迭代器简化版)
for(String s :list) {
System.out.print(s +"\t");
}
结果:
a b itheima a A
======================
a b itheima a A
======================
a b itheima a A
======================
List实现类
ArrayList集合
java.util.ArrayList
集合数据存储的底层结构是数组结构。元素增删慢,查找快,由于日常开发中使用最多的功能为查询数据、遍历数据,所以ArrayList
是最常用的集合。
注意:此实现不是同步的,多线程,速度快
LinkedList集合
java.util.LinkedList
集合数据存储的结构是链表结构。它是一个双向链表,方便元素添加、删除的集合。找到头和尾非常方便,里边有大量的操作首尾元素的方法。
注意:此实现不是同步的,多线程,速度快
LinkedList集合也可以作为堆栈,队列的结构使用。实际开发中对一个集合元素的添加与删除经常涉及到首尾操作,而LinkedList提供了大量首尾操作的方法。这些方法我们作为了解即可:
-
public void addFirst(E e)
:将指定元素插入此列表的开头。 -
public void addLast(E e)
:将指定元素添加到此列表的结尾。 -
public void push(E e)
:将元素推入此列表所表示的堆栈。 -
public E getFirst()
:返回此列表的第一个元素。 -
public E getLast()
:返回此列表的最后一个元素。 -
public E removeFirst()
:移除并返回此列表的第一个元素。 -
public E removeLast()
:移除并返回此列表的最后一个元素。 -
public E pop()
:从此列表所表示的堆栈处弹出一个元素。 -
public boolean isEmpty()
:如果列表不包含元素,则返回true。
LinkedList集合的特点
java.util.LinkedList集合 implements List接口
-
底层是一个链表结构:查询慢,增删快
-
里边包含了大量操作首尾元素的方法
-
若想使用LinkedList集合特有的方法,不能用多态
方法演示:
import java.util.LinkedList;
public class Demo02LinkedList {
public static void main(String[] args) {
LinkedList<String> link = new LinkedList<String>();
//添加元素
link.addFirst("abc1");
link.push("sss"); // 作用相同
link.addLast("abc2");
System.out.println(link); // [sss, abc1, abc2]
// 获取元素
System.out.println(link.getFirst()); // sss
System.out.println(link.getLast()); // abc2
// 删除元素
System.out.println(link.removeFirst()); // sss
System.out.println(link.removeLast()); // abc2
while (!link.isEmpty()) { //判断集合是否为空
System.out.println(link.pop()); //弹出集合中的栈顶元素
}
System.out.println(link); // abc1
link.clear();
System.out.println(link); // []
// 清空集合中的元素 在获取集合中的元素会抛出NoSuchElementException
}
}
结果:
[sss, abc1, abc2]
sss
abc2
sss
abc2
abc1
[]
[]
Vector集合
- 底层:数组
- 同步:单线程,速度慢。ArrayList逐渐取代了它
方法
添加
将指定的组件添加到此向量的末尾,将其大小增加1
void addElenent(E obj)
遍历
测试此枚举是否含有更多元素
boolean hasMoreElements()
若有下一个可提供元素,则返回true
E nextElement()
JDK1.2后,可以使用List接口遍历的方法了