Java基础L

List整个系列的类关系图

在这里插入图片描述
通过类关系图可以知道Collection继承了Iterator,从而List和Set都可以使用迭代器进行遍历。

List接口规定了List的一些基础的方法。

ArrayList

实现原理
ArrayList内部实现是数组,默认初始化大小是10,在扩容时以原来的二分之一进行,int newCapacity = oldCapacity + (oldCapacity >> 1);

ArrayList可以支持下标进行访问,但无法类似于数组那样直接通过下标访问。
须通过set,get方法进行下标访问。使用下标访问要比使用迭代器访问效率高。

//数组
array[0] = 1;
int a = array[0]
// ArrayList
arrayList.set(0,1);
arrayList.get(0);

优点
ArrayList实现了RandomAccess,可以随机快速访问元素。适用于查找。

LinkedList

实现原理
内部通过链表实现,对于频繁插入删除操作是非常适合的。LinkedList不支持随机访问,但它依然提供类似于ArrayList的get(index)方法,这个方法的实现是通过index进行for循环遍历。
以下是LinkedList内部get方法的源码,通过保存头尾节点的指针进行遍历。

Node<E> node(int index) {
        if (index < (size >> 1)) {
            Node<E> x = first;
            for (int i = 0; i < index; i++)
                x = x.next;
            return x;
        } else {
            Node<E> x = last;
            for (int i = size - 1; i > index; i--)
                x = x.prev;
            return x;
        }
    }

在遍历时,可以使用for-each或者迭代器进行遍历,性能都要优于上面的get(index)

优点
对于插入删除操作效率要尤于ArrayList。

Vector

实现原理
与ArrayList一样,内部都是数组实现。在进行动态扩容方面,ArrayList是增长自身的50%,而Vector是进行自身翻倍,其余跟ArrayList无太大区别。
各个方法都加了synchronized关键字进行同步,是线程安全的一个类,进行同步也意味着性能下降。
优点
线程同步

总结

List接口规定最基础的方法,子类进行个性化实现。
ArrayList适合用于多查找的场景。
LinkedList适合用于多插入多删除的场景。
Vector是线程安全类,适合用于多线程访问的场景。

猜你喜欢

转载自blog.csdn.net/weixin_41768073/article/details/83713581
l