zoukankan      html  css  js  c++  java
  • 数组Array和列表集合ArrayList、LinkedList和Vector的区别

    一、ArrayList和Vector的区别


    ArrayList与Vector主要从以下方面来说.  
     

    1.同步性:


       Vector是线程安全的,也就是说是同步的,而ArrayList是线程序不安全的,不是同步的。
     

    2.操作:


        由于Vector支持多线程操作,所以在性能上就比不上ArrayList了。
     

    3.数据增长:


           ArrayList和Vector都有一个初始的容量大小,当存储进去它们里面的元素个数超出容量的时候,就需要增加ArrayList和Vector的存储空间,每次增加存储空间的时候不是只增加一个存储单元,是增加多个存储单元。

           Vector默认增加原来的一倍,ArrayList默认增加原来的0.5倍。

           Vector可以由我们自己来设置增长的大小,ArrayList没有提供相关的方法。
     

    二、LinkedList与ArrayList的区别


    1、两者都实现的是List接口,不同之处在于:


    (1)、ArrayList是基于动态数组实现的,LinkedList是基于链表的数据结构。

    (2)、get访问List内部任意元素时,ArrayList的性能要比LinkedList性能好。LinkedList中的get方法是要按照顺序从列表的一端开始检查,直到另一端。

    (3)、对于新增和删除操作LinkedList要强于ArrayList,因为ArrayList要移动数据。

           LinkedList实现了List接口,允许null元素。此外LinkedList提供额外的get,remove,insert方法在LinkedList的首部或尾部。这些操作使LinkedList可被用作堆栈(stack),队列(queue)或双向队列(deque)。

           注意LinkedList没有同步方法。如果多个线程同时访问一个List,则必须自己实现访问同步。一种解决方法是在创建List时构造一个同步的List:

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



    2、ArrayList和LinkedList在性能上各有优缺点,都有各自所适用的地方,总的说来可以描述如下:


    1.对ArrayList和LinkedList而言,在列表末尾增加一个元素所花的开销都是固定的。对 ArrayList而言,主要是在内部数组中增加一项,指向所添加的元素,偶尔可能会导致对数组重新进行分配;而对LinkedList而言,这个开销是 统一的,分配一个内部Entry对象。 


    2.在ArrayList的 中间插入或删除一个元素意味着这个列表中剩余的元素都会被移动;而在LinkedList的中间插入或删除一个元素的开销是固定的。 


    3.LinkedList不 支持高效的随机元素访问。 


    4.ArrayList的空 间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间 


    可以这样说:
    当操作是在一列 数据的后面添加数据而不是在前面或中间,并且需要随机地访问其中的元素时,使用ArrayList会提供比较好的性能;当你的操作是在一列数据的前面或中 间添加或删除数据,并且按照顺序访问其中的元素时,就应该使用LinkedList了。 

    所以,如果只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以。如果是对其它指定位置的插入、删除操作,最好选择LinkedList


               ArrayList与LinkedList 在JDK中所在的位置

     

    三、数组Array和列表集合ArrayList的区别


      Array可以包含基本类型和对象类型,ArrayList只能包含对象类型。

      Array大小是固定的,ArrayList的大小是动态变化的。 

      ArrayList提供了更多的方法和特性,比如添加全部addAll()、删除全部removeAll()、返回迭代器iterator()等。

      对于基本类型数据,集合使用自动装箱来减少编码工作量。但是,当处理固定大小的基本数据类型的时候,这种方式相对比较慢。

    适用场景:

    如果想要保存一些在整个程序运行期间都会存在而且不变的数据,我们可以将它们放进一个全局数组里, 但是如果我们单纯只是想要以数组的形式保存数据,而不对数据进行增加等操作,只是方便我们进行查找的话,那么,我们就选择 ArrayList。

    如果我们需要对元素进行频繁的移动或删除,或者是处理的是超大量的数据,那么,使用 ArrayList 就真的不是一个好的选择,因为它的效率很低,使用数组进行这样的动作就很麻烦,那么,我们可以考虑选择 LinkedList。


    上海尚学堂Java培训整理编辑,获取java学习资料视频等请联系咨询

  • 相关阅读:
    【LeetCode】【动态规划】Edit Distance
    【LeetCode】最大子阵列 Maximum Subarray(贪婪&分治)
    【LeetCode】【矩阵旋转】Rotate Image
    解决Torch.load()错误信息: UnicodeDecodeError: 'ascii' codec can't decode byte 0x8d in position 0: ordinal not in range(128)
    使用VS Code配合Remote Development插件连接远程服务器(Mac/Linux+Windows) | Using VS Code with Remote Development Connect to Remote Server (Mac/Linux+Windows)
    Leaflet入门:添加点线面并导入GeoJSON数据|Tutorial of Leaflet: Adding Points, Lines, Polygons and Import GeoJSON File
    使用Adobe Illustrator + ArcGIS绘制地图 | Map Design Using ArcGIS + Adobe Illustrator
    PostgreSQL 速查、备忘手册 | PostgreSQL Quick Find and Tutorial
    LIRE教程之源码分析 | LIRE Tutorial of Analysis of the Source Code
    解决Tomcat错误信息:No 'Access-Control-Allow-Origin' header is present on the requested resource | Solving Tomcat Error: No 'Access-Control-Allow-Origin' header is present on the requested resource
  • 原文地址:https://www.cnblogs.com/shsxt/p/9179706.html
Copyright © 2011-2022 走看看