List 是 Collection 集合 的子接口,它里面可以保存各个重复的内容。List 接口扩展了 Collection 接口,在原来接口方法的基础上面增加了方法。List 扩展方法:
方法 | 描述 |
---|---|
void add(int index, E element); | 在指定位置增加元素 |
boolean addAll(int index, Collection<? extends E> c); | 在指定的位置增加一组元素 |
E get(int index); | 返回指定位置的元素 |
int indexOf(Object o); | 查找指定元素的位置 |
int lastIndexOf(Object o); | 从后向前查找指定元素的位置 |
ListIterator |
为 ListIterator 接口实例化,可以进行双向输出 |
E remove(int index); | 按指定的位置删除元素 |
List |
取出集合的子集合 |
E set(int index, E element); | 替换指定位置的元素 |
List 也是一个 接口,它不能实例化对象,所以想要用 List 的集合,需要用它的子类。
ArrayList 是 List 的子类,它的底层核心还是对数组进行操作,将对数组的操作进行了封装。让使用者比较方便的使用。
package com.haicoder.net.collection;
import java.util.ArrayList;
import java.util.List;
public class ArrayListTest {
public static void main(String[] args) {
System.out.println("嗨客网(www.haicoder.net)");
//定义一个 ArrayList 对象
List<String> strArrayList = new ArrayList();
//添加元素操作
strArrayList.add("嗨客网");
strArrayList.add("你好啊");
strArrayList.add(1, "愿你存活100年");
System.out.println("元素添加后如下:" + strArrayList);
//获取集合长度
System.out.println("结合长度:" + strArrayList.size());
//移除元素
strArrayList.remove(2);
strArrayList.remove("愿你存活100年");
System.out.println("元素删除后结果如下:" + strArrayList);
//将删除的元素重新添加
strArrayList.add("你好啊");
strArrayList.add(1, "愿你存活100年");
System.out.println("重新添加元素为:" + strArrayList);
//将指定位置的元素输出
System.out.println("第二个位置的元素为:" + strArrayList.get(1));
//判断元素是否存在
System.out.println("判断 嗨客网是否存在: " + strArrayList.contains("嗨客网"));
System.out.println("判断 www.haicoder.net 是否存在: " + strArrayList.contains("www.haicoder.net"));
//截图集合元素,是左闭右开即位置 >= 左边数 < 右边的数
System.out.println("截取第 2 位和第 3 位元素插入新数组中:" + strArrayList.subList(1, 3));
}
}
运行结果如下
Arraylist 的本质还是对 数组 进行操作。它将对数组的操作进行封装,让开发人员在使用的时候比较方便,快速入手。所以在对数组位置进行操作的时候,需要从 0 开始。
Vector 类也是 List 类的子类,它的出现比 List 还早。集合框架的概念呢是在 Jdk 1.2 之后才被重视和强调的,由于大部分开发者已经熟悉了 Vector,所以就 Java 的设计者就保留了 Vector,并且让其实现了 List 接口。它的用法与 ArrayList 相似。
package com.haicoder.net.collection;
import java.util.Vector;
public class VectorTest {
public static void main(String[] args) {
System.out.println("嗨客网(www.haicoder.net)");
Vector<String> strVector = new Vector<>();
//添加元素操作
strVector.add("嗨客网");
strVector.add("你好啊");
strVector.add(1, "愿你存活100年");
System.out.println("元素添加后如下:" + strVector);
//获取集合长度
System.out.println("结合长度:" + strVector.size());
//移除元素
strVector.remove(2);
strVector.remove("愿你存活100年");
System.out.println("元素删除后结果如下:" + strVector);
//将删除的元素重新添加
strVector.add("你好啊");
strVector.add(1, "愿你存活100年");
System.out.println("重新添加元素为:" + strVector);
//将指定位置的元素输出
System.out.println("第二个位置的元素为:" + strVector.get(1));
//判断元素是否存在
System.out.println("判断 嗨客网是否存在: " + strVector.contains("嗨客网"));
System.out.println("判断 www.haicoder.net 是否存在: " + strVector.contains("www.haicoder.net"));
//截图集合元素,是左闭右开即位置 >= 左边数 < 右边的数
System.out.println("截取第 2 位和第 3 位元素插入新数组中:" + strVector.subList(1, 3));
}
}
运行结果如下:
我们看到,在 ArrayList 里面的操作在 Vector 里面都可以适用,两者区别是啥呢?
比较点 | ArrayList | Vector |
---|---|---|
性能 | 采用异步处理方式,性能高 | 采用同步方式,性能比较低 |
线程安全 | 非线程安全的 | 线程安全的 |
还有一些特定的方法不同,这些需要读者在实际使用中发现。
与 Arraylist 底层数组不同,LinkedList 的底层是一个链表,链表在插入和删除的时候,操作比数据快,但是查询的时候,速度比较慢。ListedList 它拥有自己的特有方法。
方法 | 描述 |
---|---|
public E element() | 找到脸部的表头元素 |
public boolean offer(E e) | 将制定元素增加到链表的结尾 |
public E peek() | 找到但是不删除链表的头 |
public E poll() | 找到并删除此链表的头 |
public E remove() | 检索并移除表头 |
public void addFirst(E e) | 在链表表头增加元素 |
public void addLast(E e) | 在链表结尾增加元素 |
public E removeFirst() | 删除链表的第一个元素 |
public E removeLast() | 删除链表的最后一个元素 |
package com.haicoder.net.collection;
import java.util.LinkedList;
public class LinkedListTest {
public static void main(String[] args) {
System.out.println("嗨客网(www.haicoder.net)");
LinkedList strLinkedList = new LinkedList();
//添加元素
strLinkedList.add("嗨客网");
strLinkedList.addFirst("Hello");
strLinkedList.addLast("www.haicoder.net");
System.out.println("元素为:" + strLinkedList);
System.out.println("用 element 方法获取到表头:" + strLinkedList.element());
System.out.println("找完后链表内容:" + strLinkedList);
System.out.println("peek 方法获取表头 " + strLinkedList.peek());
System.out.println("peek 方法获取表头,链表结果:" + strLinkedList);
System.out.println("poll 方法获取表头:" + strLinkedList.poll());
System.out.println("poll 方法获取表头,链表结果:" + strLinkedList);
}
}
运行结果如下:
LinkedList 这边对头和尾操作的方法比较多,和 ArrayList 比较而言,链表对数据的增加和修改删除比数组快,所以在平时使用过程中,如果对一组数据进行修改比较多的话,我们可以考虑使用 LinkedList,而查询的场景比较多可以考虑使用 ArrayList 集合。
对一组同类型的数据,并且数据可以重复的场景,我们可以使用 List 集合。List 接口的实现类里面的方法基本都是一样的。
ArrayList 和 Vector 的底层核心是数组,ArrayList 不是线程安全的,它的效率比 Vector 要高,LinkedList 底层是一个链表,它的操作中增加,删除的效率会比较高。