Java List

Java List教程

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(); 为 ListIterator 接口实例化,可以进行双向输出
E remove(int index); 按指定的位置删除元素
List subList(int fromIndex, int toIndex); 取出集合的子集合
E set(int index, E element); 替换指定位置的元素

List 也是一个 接口,它不能实例化对象,所以想要用 List 的集合,需要用它的子类。

Java ArrayList类

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)); } }

运行结果如下
02 Arraylist操作.png

Arraylist 的本质还是对 数组 进行操作。它将对数组的操作进行封装,让开发人员在使用的时候比较方便,快速入手。所以在对数组位置进行操作的时候,需要从 0 开始。

Java Vector类

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)); } }

运行结果如下:

03 Vector操作.png

我们看到,在 ArrayList 里面的操作在 Vector 里面都可以适用,两者区别是啥呢?

比较点 ArrayList Vector
性能 采用异步处理方式,性能高 采用同步方式,性能比较低
线程安全 非线程安全的 线程安全的

还有一些特定的方法不同,这些需要读者在实际使用中发现。

Java LinkedList类

与 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); } }

运行结果如下:

04 LinkedList.png

LinkedList 这边对头和尾操作的方法比较多,和 ArrayList 比较而言,链表对数据的增加和修改删除比数组快,所以在平时使用过程中,如果对一组数据进行修改比较多的话,我们可以考虑使用 LinkedList,而查询的场景比较多可以考虑使用 ArrayList 集合。

Java List总结

对一组同类型的数据,并且数据可以重复的场景,我们可以使用 List 集合。List 接口的实现类里面的方法基本都是一样的。

ArrayList 和 Vector 的底层核心是数组,ArrayList 不是线程安全的,它的效率比 Vector 要高,LinkedList 底层是一个链表,它的操作中增加,删除的效率会比较高。