ArrayList、LinkedList 、Vector 的区别_arraylist和linkedlist 和vector的区别-程序员宅基地

技术标签: java  数据结构  开发语言  

总述:
这三者都是实现集合框架中的 List 接口,也就是所谓的有序集合,因此具体功能也比较近似,比如都提供搜索、添加或者删除的操作,都提供迭代器以遍历其内容等功能。

//ArrayList
public class ArrayList<E> 
		extends AbstractList<E>
        implements List<E>, RandomAccess, Cloneable, java.io.Serializable
//LinkedList
public class LinkedList<E>
    	extends AbstractSequentialList<E>
    	implements List<E>, Deque<E>, Cloneable, java.io.Serializable  
//Vector 
public class Vector<E>
    	extends AbstractList<E>
    	implements List<E>, RandomAccess, Cloneable, java.io.Serializable
  

从类的继承以及实现的接口来看,ArrayList 和 Vector 实现的功能应该是一样的,区别上应该和StringBuilder和StringBuffer一样,一个线程不安全,一个线程安全。

区别:

1.数据结构实现:

ArrayList 和 Vector 是动态数组的数据结构实现,而 LinkedList 是双向循环链表的数据结构实现。

//ArrayList
transient Object[] elementData; // non-private to simplify nested class access
//默认初始容量是10
private static final int DEFAULT_CAPACITY = 10;
//最大容量
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
//扩容方法
private void grow(int minCapacity) {
    
        // overflow-conscious code
        int oldCapacity = elementData.length;
        //newCapacity 是原来的1.5倍
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        // minCapacity is usually close to size, so this is a win:
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
public boolean add(E e){
    //忽略}
public E get(int index){
    //忽略}
//********************分割线************************
//Vector
protected Object[] elementData;
//默认初始容量是10
public Vector() {
    
        this(10);
    }
//最大容量和ArrayList一样
//扩容
private void grow(int minCapacity) {
    
        // overflow-conscious code
        int oldCapacity = elementData.length;
        //newCapacity 是原来的 2 倍
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                         capacityIncrement : oldCapacity);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity);
    }
//添加
public synchronized boolean add(E e) {
    //忽略}
//
public synchronized E get(int index) {
    //忽略}
//********************分割线************************
//LinkedList
transient Node<E> first;
transient Node<E> last;
private static class Node<E> {
    
        E item;
        //指向后继
        Node<E> next;
        //指向前驱
        Node<E> prev;

        Node(Node<E> prev, E element, Node<E> next) {
    
            this.item = element;
            this.next = next;
            this.prev = prev;
        }
    }
//可以用LinkedList实现Queue、Deque、Stack。具体请看LinkedList的源码或者API文档

从以上源码我们发现,ArrayList 和 Vector最大的区别就是:
ArrayList:线程不安全
Vector :线程安全

2.随机访问效率:

ArrayList 和 Vector 比 LinkedList 在根据索引随机访问的时候效率要高,因为 LinkedList 是链表数据结构,需要移动指针从前往后依次查找。

3.增加和删除效率:

在非尾部进行增加和删除操作时,LinkedList 要比 ArrayList 和 Vector 效率要高,因为 ArrayList 和 Vector 增删操作需要移动大量数组(在第i个位置插入元素时,i位置之后的所有元素都要后移一位,删除元素时,要前移)。 而LinkedList只需要修改 next 和 prev 指针。
ArrayList 非线程安全,在增删元素时性能比 Vector 好。

4.内存空间占用:

一般情况下LinkedList 比 ArrayList 和 Vector 更占内存,因为 LinkedList 的节点除了存储数据,还存储了两个引用,分别是前驱节点和后继节点。

5.线程安全:

ArrayList 和 LinkedList 都是不同步的,也就是不保证线程安全;Vector 使用了 synchronized 来实现线程同步,是线程安全的。

6.扩容:

ArrayList 和 Vector 都会根据实际的需要动态的调整容量,只不过在 Vector 扩容每次会增加 1 倍容量,而 ArrayList 只会增加 50%容量。分析请看上述源码。

使用场景:

在需要频繁地随机访问集合中的元素时,推荐使用 ArrayList,希望线程安全的对元素进行增删改操作时,推荐使用Vector,而需要频繁插入和删除操作时,推荐使用 LinkedList。

写在最后:
技术人成长之路 总结的很全面,对于面试应该是够了。我在原作者总结之上加了相应的源码加以佐证,侵权即删。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_47241118/article/details/124731771

智能推荐

openssl qt 生成秘钥_delphi - 使用OpenSSL生成密钥对 - 堆栈内存溢出-程序员宅基地

文章浏览阅读593次。我正在使用delphiopenssl包装器生成.pem格式的密钥文件。 我正在使用“ 生成RSA密钥”示例来生成这些密钥。我需要的两天前,我希望找到一种简单的方法来生成RSA密钥,并使用它们来加密/解密某些字符串或TBytes缓冲区。 现在,在搜索了所有可能的解决方案之后,我决定使用OpenSSL来完成这项工作我的问题问题是我无法使用功能输入的文件名创建文件。 但是我仍然得到一个名为“ C”..._lzqtxh

HashSet集合去重原理:_hashset去重底层实现原理-程序员宅基地

文章浏览阅读1.9k次,点赞2次,收藏2次。Set是一个继承于Collection的接口,即Set也是集合中的一种。Set是没有重复元素的集合。HashSet是Set接口典型实现,它按照Hash算法来存储集合中的元素,具有很好的存取和查找性能。底层数据结构是哈希表。哈希表即一个元素为链表的数组,综合了数组与链表的优点。不保证set的迭代顺序HashSet不是同步的,如果多个线程同时访问一个HashSet,要通过代码来保证其同步集合元素值可以是null,但只能有一个null。_hashset去重底层实现原理

cuda安装与可能遇到的问题_export ld_library_path=/usr/local/cuda-11.x/lib64:-程序员宅基地

文章浏览阅读2.3k次。sudo dpkg -i cuda-repo-ubuntu1404-8-0-local_8.0.44-1_amd64.debsudo apt-get updatesudo apt-get install cuda查看显卡信息:nvidia-smi确定驱动成功安装:cat /proc/driver/nvidia/version设置环境变量:sudo gedit /etc/profile添加_export ld_library_path=/usr/local/cuda-11.x/lib64:$ld_library_path

个人学习笔记:对比STM32,ESP32有哪些优势-程序员宅基地

文章浏览阅读103次。相比之下,STM32虽然也具有高性能、丰富的外设资源和高可靠性等特点3,但在低功耗设计、网络连接能力和特定于物联网的应用场景方面,ESP32展现出了更明显的优势。ESP32提供了丰富的功能集,包括双核处理器、内置温度和霍尔传感器、更大的RAM、闪存以及对蓝牙和以太网的支持,这些都是以相对较低的成本实现的25。这使得ESP32在需要长时间运行的应用中表现出色,如智能手表或智能家居设备。此外,ESP32的设计理念使其能够以较少的外围器件实现强大的处理性能和可靠的安全性能8,这进一步降低了开发难度和成本。

React基础知识_react unmount-程序员宅基地

文章浏览阅读370次。React基础知识_react unmount

bzoj3166: [Heoi2013]Alo【可持久化线段树】_bzoj 3166-程序员宅基地

文章浏览阅读266次。DescriptionWelcome to ALO ( Arithmetic and Logistic Online)。这是一个VR MMORPG , 如名字所见,到处充满了数学的谜题。 现在你拥有n颗宝石,每颗宝石有一个能量密度,记为ai,这些宝石的能量 密度两两不同。现在你可以选取连续的一些宝石(必须多于一个)进行融合,设为 ai, ai+1, …, a j,则融合而成的宝石的能量..._bzoj 3166

随便推点

Android adb/串口命令设置和获取系统音量_android手机发送usb hid 音量设置指令-程序员宅基地

文章浏览阅读1.6k次。原文地址:https://blog.csdn.net/sunxiaolin2016/article/details/1088437161、查看audio的全部信息(各音频流音量,焦点,策略等) dumpsys audio12、设置音量并且显示音量UI //stream 3表示多媒体,10表示音量值 media volume --show --stream 3 --set 101 23、音量调大调小 media volume --stream 3 --adj r._android手机发送usb hid 音量设置指令

生物传感器技术的进步:从基因测序到智能穿戴设备-程序员宅基地

文章浏览阅读790次,点赞15次,收藏12次。1.背景介绍生物传感器技术是一种用于测量生物系统中物质、信息和能量变化的设备。它们在医疗、环境监测、农业和生物科学等领域具有广泛的应用。随着科技的发展,生物传感器技术不断进步,从基因测序到智能穿戴设备,这些技术的进步为我们提供了更多的可能性和机遇。在本文中,我们将探讨生物传感器技术的进步,包括基因测序、微机器人、生物芯片和智能穿戴设备等领域的发展。我们将讨论这些技术的核心概念、联系和算法原...

COM多线程原理与应用-程序员宅基地

文章浏览阅读33次。http://blog.csdn.net/sheismylife/article/details/217033目录:COM多线程原理与应用... 1目录:... 1前言:... 1套间:... 1套间的定义:... 1套间的分类:... 2套间的进入和退出:.. 2对象的同步:... 2组件对象的同步:... 2COM对象线程模型:.. 2进程内对象...

什么是“月结30天”?(轉)-程序员宅基地

文章浏览阅读9k次。2019独角兽企业重金招聘Python工程师标准>>> ..._月结30天

《深入理解Android内核设计思想》-程序员宅基地

文章浏览阅读523次。《深入理解Android内核设计思想》基本信息作者: 林学森 出版社:人民邮电出版社ISBN:9787115348418上架时间:2014-4-25出版日期:2014 年5月开本:16开页码:687版次:1-1所属分类:计算机 &gt; 软件与程序设计 &gt; 移动开发 &gt; Android更多关于》》》《深入理解Android内核设计思想..._android内核设计思想

【C/C++学院】(12)C++标准模板库STL-程序员宅基地

文章浏览阅读185次。1.简介 STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器)。2.vector向量#include "iostream"#include "vector"using namespace std;//== != [] =//(vector<int>..._c++学院-stl

推荐文章

热门文章

相关标签