zoukankan      html  css  js  c++  java
  • ArrayList、Vector、LinkedList的区别

    1.底层数据结构:

      ArrayList  底层实现是动态数组

      Vector   底层实现是动态数组

      LinkedList  底层实现是双链表  

     2.扩容机制:

      ArrayList    底层是动态数组存在扩容说法,默认的数组大小是10,在检测是否需要扩容后,如果扩容,会扩容为原来的1.5倍大小。原理就是把老数组的元素存储到新数组里面。

      Vector     底层是动态数组存在扩容说法,默认的数组大小是10,在检测是否需要扩容后,如果扩容,会扩容为原来的2倍大小。原理就是把老数组的元素存储到新数组里面。

      LinkedList    不存在扩容的说法,因为是链表结构。 

    3.线程安全:

      ArrayList  在单线程环境下是安全的,多线程环境下不是线程安全的,容易造成脏读的问题,如果要使ArrayList是线程安全的,那么可以选择使用Collections.synchronizedList(new ArrayList())

      Vector      是线程安全的,即它大部分的方法都包含关键字synchronized,但是Vector的效率没有ArraykList和LinkedList高

      LinkedList   在单线程环境下是安全的,多线程环境下不是线程安全的,容易造成脏读的问题,如果要使LinkedList是线程安全的,那么可以选择使用Collections.synchronizedList(new LinkedList())

    4.插入和删除:

      ArrayList  因为是一块连续的内存存储数据元素,所以如果要删除或者插入一个元素,那么之前或者之后的元素都要移动,代价很高。

      Vector      这点和ArrayList相同。

      LinkedList   底层是双链表,对于插入或者删除元素来说,操作方便,性能高。

     5.查找:

      ArrayList  查找性能好,因为底层是数组,适用于查找元素。

      Vector      这点和ArrayList相同。

      LinkedList   是双链表,在内存中可以是不连续的,通过指针连接结点,如果要查找元素,必须去遍历整个链表,这样就比较麻烦。

    6.内存空间占用:

      ArrayList  空间浪费主要体现在list列表的结尾会预留一定的容量空间。

      Vector      这点和ArrayList相同。

      LinkedList   花费则体现在它的每一个元素都需要消耗比ArrayList更多的空间(因为要存放直接后继和直接前驱以及数据)。

    总结:

    线程安全: Vector线程安全但是性能低,因此在不需要保证线程安全时建议使用Arraylist而不是Vector;

    查找:   Arraylist性能高于LinkedList。

    添加和删除:LinkedList性能高于Arraylist。

     

  • 相关阅读:
    POJ 2528 Mayor's posters 【区间离散化+线段树区间更新&&查询变形】
    HDU 5687 Problem C 【字典树删除】
    HDU 1298 T9【字典树增加||查询】
    AIM Tech Round 5 (rated, Div. 1 + Div. 2) C. Rectangles 【矩阵交集】
    基本数据结构:栈-队列-双向队列
    Elasticsearch 环境准备
    django项目部署
    linux基础
    购物车
    Python内置函数
  • 原文地址:https://www.cnblogs.com/yuki67/p/12073677.html
Copyright © 2011-2022 走看看