天天看点

Java集合框架篇-45-ArrayList,LinkedLis和Vector三个类的特点和区别

       在集合框架第一篇文章,我们画了图表示集合继承体系。知道List接口下有三个子类,分别是ArrayList,LinkedList和Vector。已经知道ArrayList和Vector的底层是基于数组实现,而linkedlist是基于链表的实现。

什么是链表?

       数组的结构,我们大概知道。就是在内存中开辟一块完整的内存空间,然后把空间分成大小相同的几等分,这个几等分就是数组元素大小。那么,链表是什么?链表就是一个数据存储的结构,链表有一个明显的特点就是,一个节点能保存前面一个节点和后一个节点的内存地址。这个可以用小朋友手拉手过马路来形象。除了头和尾的小朋友是一只手和其他小朋友有牵连,中间的小朋友都是一只手和他前面一个小朋友相连,另外一只手是和后面一个小朋友相连。这个就是链表结构,每一个链表节点存储了前面一个节点的内存地址和后面一个节点的内存地址。

数组存储和链表存储的对比

数组:

数组是根据索引来查找和修改元素,速度快。

数组删除和增加元素速度慢。

链表:

链表是根据首节点元素开始查找或者是尾部节点元素查找,一个一个节点去查找,速度慢

链表的删除和增加元素速度快。

List接口下三个子类的特点:

ArrayList

        -底层数据结构是数组,查询快,删除和增加慢

        -线程不安全,效率高

Vector

        -底层数据结构是数组,查询快,删除和增加慢

        -线程安全,效率低

LinkedList

        -底层是链表实现,查询和修改慢,删除和增加快

        -线程不安全,效率高

所以,这个就总结出一个面试题,ArrayList和LinkedList的区别是什么

        -ArrayList底层是数组实现,查询和修改快,增删慢。

        -LinkedList底层是链表实现,查询和修改慢,增删快

        --共同点是:线程不安全,效率高。

List下三个类,我们到底用哪个?

        --查询多,用ArrayList

        --增删多,用LinkedList

        --如果都多,用ArrayList

        --Vector类被淘汰,用ArrayList替代。即使Vector是线程安全的,ArrayList是线程不安全,也不用Vector,因为后面我们会学习到用一个工具类,去把不安全的ArrayList转换成安全的线程。