java源码解析--List

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

List集合

An ordered collection – 有序集合

//List  的类信息
public interface List<E> extends Collection<E>
//Collection 的类信息--定义基本的method
public interface Collection<E> extends Iterable<E>
//Iterable 的类信息---值得一说,jdk1.8+foreach就是此处
public interface Iterable<T>

关注的实现类

  1. ArrayList
  2. LinkedList
  3. Vector

ArrayList

特点: 遍历速度快,底层原理数组,非线程安全
源码解析:

//无参构造
public ArrayList() {
   this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
// elementData 是一个对象数组
transient Object[] elementData; 
//DEFAULTCAPACITY_EMPTY_ELEMENTDATA 是一个常量空对象数组
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
// CRUD---add方法
public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }
   ...
   //底层原理--还是数组的copy
    Arrays.copyOf(elementData, newCapacity);

由此可见,ArrayList 底层数据结构是数组,crud是数组的copy,非线程安全,但是有数组的特性,遍历速度快

LinkedList

特点: 更新速度快,底层原理链表,非线程安全
源码解析:

//无参构造
public LinkedList() {
}
// 关键成员变量
//数组长度
transient int size = 0;
//链表第一个元素
transient Node<E> first;
//链表最后一个元素
transient Node<E> last;
//crud方法--add
public boolean add(E e) {
        linkLast(e);
        return true;
}
...
//原理--改变上一个元素和下一个元素,然后修改长度
void linkLast(E e) {
        final Node<E> l = last;
        final Node<E> newNode = new Node<>(l, e, null);
        last = newNode;
        if (l == null)
            first = newNode;
        else
            l.next = newNode;
        size++;
        modCount++;
    }

由此可见,ArrayList 底层数据结构是链表,crud是改变链表的上下指向,所以更新效率高于数组,同时也是非线程安全

Vector

特点: 遍历速度快,底层原理数组,线程安全
源码解析:

//无参构造
public Vector() {
   this(10);
}
// this(10);干了什么
this.elementData = new Object[10];
this.capacityIncrement = 10;
//elementData  是一个对象数组
protected Object[] elementData;
//capacityIncrement 是长度变量
protected int elementCount;

//crud方法--add  synchronized 修饰线程安全
public synchronized boolean add(E e) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = e;
        return true;
 }
...
//原理--数组的copy
elementData = Arrays.copyOf(elementData, newCapacity);

由此可见,Vector底层数据结构是数组,crud是数组的copy,同时由synchronized 修饰是线程安全的,但是效率不如ArrayList

总结

ArrayList 和 Vector 底层都是数组,不同的是Vector 是线程安全的,缺点都是更新慢
LinkedList 底层是链表,非线程安全,优点是更新快,缺点遍历慢

猜你喜欢

转载自blog.csdn.net/zl_1079167478/article/details/83271010