java List三个子类的数据结构和特点

数组:

数组特点:查询和修改快,增加和删除慢

ArrayList和Vector的底层是使用数组的数据结构

在ArrayList中初始化的长度是10,如果长度不够用了,每次会增加之前长度的50%,然后将旧的集合中的数据拷贝到新的集合中。Vector每次扩容的长度是之前的一倍

数组的结构:

 为什么查询和修改快?
查询和修改时直接通过数组的下标就能快速定位到相应的位置。
为什么增加和删除慢?
数组里面内存地址是连续的,增加和删除时要改变数组的长度,这样可能会导致牵一发而动全身的操作,比如在下标是2位置上的元素进行删除,那么后面每个位置上面的元素都会向前移动。

链表:

链表特点:增加和删除快,查询和修改慢

LinkedList的底层使用的是链表数据结构 

 为什么增加和删除快?
链表里面的内存地址不是连续的,每个元素里面都保留着上一个元素和下一个元素的内存地址(首尾除外),如果要增加或删除元素时,只有与他相邻的两个位置上的元素发生变化,其他元素不用任何改变。
为什么查询和修改慢?
链表里面的内存地址不是连续的,要查找的话,需要从头或者尾部挨个查找,不能直接定位。

List三个子类的特点

三个子类都实现了List接口,所以里面的方法都差不多

三个子类的特点:

  • ArrayList:
    底层数据结构是数组,查询快,增删慢。
    线程不安全,效率高。
  • Vector:
    底层数据结构是数组,查询快,增删慢。
    线程安全,效率低。
    Vector相对ArrayList查询慢(线程安全的)
    Vector相对LinkedList增删慢(数组结构)
  • LinkedList:
    底层数据结构是链表,查询慢,增删快。
    线程不安全,效率高。

这个三个子类有什么区别和共同点?

  • Vector和ArrayList的区别
    Vector是线程安全的,效率低
    ArrayList是线程不安全的,效率高
    共同点:都是数组实现的

  • ArrayList和LinkedList的区别
    ArrayList底层是数组结果,查询和修改快
    LinkedList底层是链表结构的,增和删比较快,查询和修改比较慢
    共同点:都是线程不安全的

在开发中的选择?

查询多用ArrayList
增删多用LinkedList
如果都多ArrayList

Vector基本上不再使用了,效率比较较低。

ArrayList线程安全的方案

如果使用ArrayList去替代Vector的话,需要考虑线程安全的问题,有两种方案:

  • 可以使用Collections工具类中的synchronizedList方法可以将ArrayList变成线程安全的

     List list = Collections.synchronizedList(new ArrayList());
  • 使用java.util.concurrent包下面的CopyOnWriteArrayList替代ArrayList,使用方式跟ArrayList一样

LinkedList线程安全的方案有

List list=Collections.synchronizedList(new LinkedList());

原文http://www.monkey1024.com/javase/546

        http://www.monkey1024.com/javase/550

    

猜你喜欢

转载自blog.csdn.net/sinat_41132860/article/details/84145282