集合框架之List集合详解

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27574367/article/details/78730501

具有增删改查方法(collection不具备修改的方法)

List特有的常见方法:

add(int index,E element);
在列表的指定位置插入指定元素

addAll(int index, Collection c);
将指定 collection 中的所有元素都插入到列表中的指定位置

get(int index)
返回列表中指定位置的元素

remove(int index)
移除列表中指定位置的元素

set(int index, E element)
用指定元素替换列表中指定位置的元素

subList(int fromIndex, int toIndex)
返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图

indexOf(Object o)
返回此列表中第一次出现的指定元素的索引;如果此列表不包含该元素,则返回 -1

lastIndexOf(Object o)
返回此列表中最后出现的指定元素的索引;如果列表不包含此元素,则返回 -1

toArray()
返回按适当顺序包含列表中的所有元素的数组(从第一个元素到最后一个元素)。

hasPrevious() :逆向遍历
如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。

ListIterator:列表迭代器
在迭代过程中可以使用ListIterator对象操作元素,不会引起并发异常

hasPrevious() :逆向遍历
如果以逆向遍历列表,列表迭代器有多个元素,则返回 true。

previous()
返回列表中的前一个元素,配合hasPrevious()方法使用。

listIterator(int index)
返回列表中元素的列表迭代器(按适当顺序),从列表的指定位置开始

在迭代器迭代过程中,不能操作集合,会引起并发修改异常。

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class ListTest {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("赵六");

        Iterator<String> it = list.iterator();
        while (it.hasNext()) {
            String name = it.next();
            if (name.equals("王五")) {
                list.add("旺财");
            }
            System.out.println(name);
        }
    }
}

此时会出现java.util.ConcurrentModificationException异常(并发修改异常)

可以使用Iterator的子接口ListIterator,只有List集合具有ListIterator迭代器。
通过ListIterator对象it来完成在迭代中对元素进行增删改查(注意:使用集合对象list直接操作仍然会报错)

import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

public class ListTest {
    public static void main(String[] args) {
        List<String> list = new ArrayList<String>();
        list.add("张三");
        list.add("李四");
        list.add("王五");
        list.add("赵六");

        ListIterator<String> it = list.listIterator();
        while (it.hasNext()) {
            String name = it.next();
            if (name.equals("王五")) {
                it.add("旺财");
            }
            System.out.println(name);
        }
    }
}

List集合的子类对象

Vector:

是线程同步的, Vector 类可以实现可增长的对象数组,与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作。

Vector可以包含指定 collection 中的元素,这些元素按其 collection 的迭代器返回元素的顺序排列。

Vector在创建时可以指定初始容量和容量增量,如果只指定初始容量,则容量增量默认等于初始容量。

ArrayList:

基本等同Vector,性能优于Vector,不同步,线程不安全
内部是数组数据结构,是不同步的,替代了Vector,Vector几乎不用了,多线程时可以给其加锁,查询速度快。

可以包含指定 collection 中的元素,这些元素按其 collection 的迭代器返回元素的顺序排列。

可以指定初始容量大小。

LinkedList:

内部是链表数据结构,是不同步的,增删元素速度快

特有方法:

addFirst():将指定元素插入此列表的开头。

addLast():将指定元素添加到此列表的结尾。

getFirst():返回此列表的第一个元素。

getLast():返回此列表的最后一个元素。

removeFirst():移除并返回此列表的第一个元素。

boolean removeFirstOccurrence(Object o):从此列表中移除第一次出现的指定元素(从头部到尾部遍历列表时)。

removeLast():移除并返回此列表的最后一个元素。

List三个子类的优缺点比较:

  1. Vector & ArrayList
    1) Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的同步必然要影响性能,因此,ArrayList的性能比Vector好。
    2) 当Vector或ArrayList中的元素超过它的初始大小时,Vector会将它的容量翻倍,而ArrayList只增加50%的大小,这样,ArrayList就有利于节约内存空间。

  2. ArrayList & LinkedList
    ArrayList的内部实现是基于内部数组Object[],所以从概念上讲,它更象数组,但LinkedList的内部实现是基于一组连接的记录,所以,它更象一个链表结构,所以,它们在性能上有很大的差别:

从上面的分析可知,在ArrayList的前面或中间插入数据时,你必须将其后的所有数据相应的后移,这样必然要花费较多时间,所以,当你的操作是在一列数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;

而访问链表中的某个元素时,就必须从链表的一端开始沿着连接方向一个一个元素地去查找,直到找到所需的元素为止,所以,当你的操作是在一列数据的前面或中间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList。

猜你喜欢

转载自blog.csdn.net/qq_27574367/article/details/78730501