2019独角兽企业重金招聘Python工程师标准>>>

Vector分析:

主要特性:有序,可随机访问,可变长,可重复,线程安全等。

其结构图:

其基本属性有:

//存放元素的数组
protected Object[] elementData;
//元素个数
protected int elementCount;
//容量扩容指标,默认以2倍增长
protected int capacityIncrement;

从其构造函数中可以看出,Vector默认容量为10,capacityIncrement默认设为0(<=0时就以2倍扩容):

public Vector(int initialCapacity, int capacityIncrement) {super();if (initialCapacity < 0)throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);this.elementData = new Object[initialCapacity];this.capacityIncrement = capacityIncrement;}public Vector(int initialCapacity) {this(initialCapacity, 0);
}public Vector() {this(10);
}

看几个比较重要的方法,add(), remove():

add方法:

public synchronized boolean add(E e) {modCount++;ensureCapacityHelper(elementCount + 1); //扩容检测elementData[elementCount++] = e; //添加,改变引用return true;}private void ensureCapacityHelper(int minCapacity) {if (minCapacity - elementData.length > 0)grow(minCapacity);}private void grow(int minCapacity) {int oldCapacity = elementData.length;//默认2*oldCapacity, 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);//拷贝新数组}

remove方法,可见删除操作要做复制操作:

public synchronized E remove(int index) {modCount++;if (index >= elementCount)throw new ArrayIndexOutOfBoundsException(index);E oldValue = elementData(index); int numMoved = elementCount - index - 1; //被删除元素后面元素个数if (numMoved > 0)System.arraycopy(elementData, index+1, elementData, index,numMoved); //将被删除元素后面的元素往前挪elementData[--elementCount] = null; //这点很重要,让gc能够回收无引用对象,防止"内存泄漏"return oldValue;
}

Vector实现是比较简单明了的,其大部分方法都synchronized同步了,因此线程安全。

ArrayList分析:

其主要特性:有序,可随机访问,可变长,可重复,非线程安全等。

其结构图:

其主要属性:

//默认容量
private static final int DEFAULT_CAPACITY = 10;
//空标志
private static final Object[] EMPTY_ELEMENTDATA = {};
//存放元素的数组
private transient Object[] elementData;
//元素个数
private int size;

其构造方法有(不能设置ArrayList的扩容机制):

public ArrayList(int initialCapacity) { //可指定初始容量super();if (initialCapacity < 0)throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity);this.elementData = new Object[initialCapacity];
}public ArrayList() {super();this.elementData = EMPTY_ELEMENTDATA; //空数组
}public ArrayList(Collection<? extends E> c) {elementData = c.toArray();size = elementData.length;// c.toArray might (incorrectly) not return Object[] (see 6260652)if (elementData.getClass() != Object[].class)elementData = Arrays.copyOf(elementData, size, Object[].class);
}

看看其主要方法add, remove:

public boolean add(E e) {ensureCapacityInternal(size + 1);  //扩容elementData[size++] = e;return true;
}private void ensureCapacityInternal(int minCapacity) {if (elementData == EMPTY_ELEMENTDATA) {minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);}ensureExplicitCapacity(minCapacity);
}private void ensureExplicitCapacity(int minCapacity) {modCount++;// overflow-conscious codeif (minCapacity - elementData.length > 0)grow(minCapacity);
}private void grow(int minCapacity) {int oldCapacity = elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1); //扩容为原来的3/2倍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);
}

remove方法, 基本同上面Vector。

LinkedList分析:

其主要特性:可变长,可重复,不可随机访问,非线程安全等。

LinkedList不同于Vector,ArrayList(由数组实现),基于双链表实现:

其结构图:

其主要特性:可重复,不可随机访问,非线程安全。

其主要属性:

//长度
transient int size = 0;
//头
transient Node<E> first;
//尾
transient Node<E> last;

其将我们的元素抽象为Node类:

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;}}

还是看看其主要方法, add,remove:

add方法:

public boolean add(E e) {linkLast(e); //接到尾上return true;}void linkLast(E e) {final Node<E> l = last;final Node<E> newNode = new Node<>(l, e, null);last = newNode;if (l == null) //空链表first = newNode;elsel.next = newNode;size++;modCount++;}

remove方法, 主要由unlink方法实现:

E unlink(Node<E> x) {// assert x != null;final E element = x.item;final Node<E> next = x.next;final Node<E> prev = x.prev;if (prev == null) { //头节点first = next;} else {prev.next = next;x.prev = null;}if (next == null) { //尾节点last = prev;} else {next.prev = prev;x.next = null;}x.item = null;size--;modCount++;return element;
}

上面就讲了有关List集合的3个实现类,对于这三个类我们该如何选取,就的根据具体情况:

对于Vector和ArrayList, 需要同步时,则可用Vector, 或Collections.synchronizedList(),不需同步则用ArrayList, 对于这三种做了些性能测试:

  • Vector与SynchronizedList并发插入性能:5个线程,每个线程插入100w元素,Vector要更快。
  • ArrayList与LinkedList插入性能: 当数据量比较小时,LinkedList更快(前者由于复制操作耗时),当数据量比较大时(如>=50W), ArrayList更快(后者由于遍历操作耗时)。

不吝指正。

转载于:https://my.oschina.net/indestiny/blog/206950

Vector, ArrayList, LinkedList分析相关推荐

  1. java vector arraylist linkedlist用法与区别

    首先,它们是list的实现类,大致说一下vector arraylist linkedlist的区别. 1.线程安全来讲, vector是线程安全,arraylist linkedlist线程不安全. ...

  2. 读List源码之Vector,ArrayList,LinkedList

    List ,LinkedList,ArrayList,Vector ArrayList与LinkedList(间接),Vector均直接或间接继承自AbstractList,AbstractList实 ...

  3. Vector ArrayList Hashtable HashMap ArrayList LinkedList

    1. Vector & ArrayList 1)  Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的 ...

  4. ArrayList, LinkedList, Vector - dudu:史上最详解

    ArrayList, LinkedList, Vector - dudu:史上最详解 我们来比较一下ArrayList, LinkedLIst和Vector它们之间的区别.BZ的JDK版本是1.7.0 ...

  5. ArrayList,LinkedList,Vector的异同点

    先总结下ArrayList和LinkedList的区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,ArrayLi ...

  6. List接口实现类-ArrayList、Vector、LinkedList集合深入学习以及源代码解析

    学习List接口实现类 ArrayList  Vector  LinkedList List接口的实现类中最经常使用最重要的就是这三个:ArrayList.Vector.LinkedList. JDK ...

  7. ArrayList、Vector、LinkedList的特点和区别

    ArrayList.Vector.LinkedList类均在java.util包中,均为可伸缩数组. 1)ArrayList和Vector都是基于存储元素的Object[] array来实现的,它们会 ...

  8. java集合之列表:ArrayList、Vector、LinkedList

    1 package com.jdk7.chapter4; 2 3 import java.util.ArrayList; 4 import java.util.LinkedList; 5 import ...

  9. ArrayList ,LinkedList,Vector,StringBuilder,StringBuffer ,String,HashMap,LinkedHashMap,TreeMap

    ArrayList ,LinkedList,Vector 区别和联系 从上面的类层次结构图中,我们可以发现他们都实现了List接口,它们使用起来非常相似.区别主要在于它们各自的实现,不同的实现导致了不 ...

  10. Java集合之Vector源码分析

    概述 Vector与ArrayLIst类似, 内部同样维护一个数组, Vector是线程安全的. 方法与ArrayList大体一致, 只是加上 synchronized 关键字, 保证线程安全, 下面 ...

最新文章

  1. 知道为啥失败么?87%的机器学习项目都是这么栽了的……
  2. 世界无人帆船大赛首次登陆中国,水手梦也能用代码实现
  3. git pull冲突解决
  4. dw中html中无法使用js,在Dreamweaver中调用JavaScript行为
  5. Java对象转换方案分析与mapstruct实践
  6. Android系统(2)---init.rc知识
  7. Sketch vs. Figma vs. adobe xd:哪个设计工具最适合初学者?
  8. spring boot2 坑 - 解决cros跨域问题
  9. HUST 1585 排队
  10. PHP学习笔记--array_map函数
  11. sqlserver备份还原丢失dbo_编程实现备份和还原数据库_sqlserver
  12. jQuery实现选择“学科门类”、“学科大类(一级学科)”、“专业”(二级学科)实现三级联动
  13. baidupcsgo安卓_GitHub - orenbek2019/BaiduPCS-Go: 百度网盘客户端 - Go语言编写
  14. 关于soundfile写音频是报错raise RuntimeError(prefix + _ffi.string(err_str).decode(‘utf-8‘, ‘replace‘))
  15. UE4中实现鼠标单选空间中的模型、Ctrl键多选、空间打点框选功能。
  16. 题目内容: 你的程序要读入一系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据。程序输出读到的数据中的奇数和偶数的个数。 输入格式: 一系列正整数,整数的范围是(0,100000)。如果输入
  17. 基于JAVASEOUL设计师品牌代购商城计算机毕业设计源码+系统+lw文档+部署
  18. BCD码指令 AAA DAA AAS DAS AAM AAD
  19. GAMS系列分享12—GAMS基础知识——模型和求解
  20. 【SRE笔记 2022.9.21 网络及TCP握手】

热门文章

  1. Java 自动装箱与拆箱(Autoboxing and unboxing)
  2. 二分图最大匹配的经典匈牙利算法
  3. SameMovie HBOMax Video Downloader for Mac如何在 Mac 上下载 HBO Max 视频?
  4. 如何使用Super Vectorizer在 Mac 上将 PDF 转换为 SVG 矢量?
  5. Dato for Mac(菜单栏时钟工具)支持m1
  6. 通过Spring Boot中的手动Bean定义提高启动性能
  7. Linux IPC udp/ip socket 编程
  8. JS的内建函数reduce
  9. [裴礼文数学分析中的典型问题与方法习题参考解答]4.3.17
  10. css 样式文字溢出显示省略号