Vector, ArrayList, LinkedList分析
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分析相关推荐
- java vector arraylist linkedlist用法与区别
首先,它们是list的实现类,大致说一下vector arraylist linkedlist的区别. 1.线程安全来讲, vector是线程安全,arraylist linkedlist线程不安全. ...
- 读List源码之Vector,ArrayList,LinkedList
List ,LinkedList,ArrayList,Vector ArrayList与LinkedList(间接),Vector均直接或间接继承自AbstractList,AbstractList实 ...
- Vector ArrayList Hashtable HashMap ArrayList LinkedList
1. Vector & ArrayList 1) Vector的方法都是同步的(Synchronized),是线程安全的(thread-safe),而ArrayList的方法不是,由于线程的 ...
- ArrayList, LinkedList, Vector - dudu:史上最详解
ArrayList, LinkedList, Vector - dudu:史上最详解 我们来比较一下ArrayList, LinkedLIst和Vector它们之间的区别.BZ的JDK版本是1.7.0 ...
- ArrayList,LinkedList,Vector的异同点
先总结下ArrayList和LinkedList的区别: 1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构. 2.对于随机访问get和set,ArrayLi ...
- List接口实现类-ArrayList、Vector、LinkedList集合深入学习以及源代码解析
学习List接口实现类 ArrayList Vector LinkedList List接口的实现类中最经常使用最重要的就是这三个:ArrayList.Vector.LinkedList. JDK ...
- ArrayList、Vector、LinkedList的特点和区别
ArrayList.Vector.LinkedList类均在java.util包中,均为可伸缩数组. 1)ArrayList和Vector都是基于存储元素的Object[] array来实现的,它们会 ...
- java集合之列表:ArrayList、Vector、LinkedList
1 package com.jdk7.chapter4; 2 3 import java.util.ArrayList; 4 import java.util.LinkedList; 5 import ...
- ArrayList ,LinkedList,Vector,StringBuilder,StringBuffer ,String,HashMap,LinkedHashMap,TreeMap
ArrayList ,LinkedList,Vector 区别和联系 从上面的类层次结构图中,我们可以发现他们都实现了List接口,它们使用起来非常相似.区别主要在于它们各自的实现,不同的实现导致了不 ...
- Java集合之Vector源码分析
概述 Vector与ArrayLIst类似, 内部同样维护一个数组, Vector是线程安全的. 方法与ArrayList大体一致, 只是加上 synchronized 关键字, 保证线程安全, 下面 ...
最新文章
- 知道为啥失败么?87%的机器学习项目都是这么栽了的……
- 世界无人帆船大赛首次登陆中国,水手梦也能用代码实现
- git pull冲突解决
- dw中html中无法使用js,在Dreamweaver中调用JavaScript行为
- Java对象转换方案分析与mapstruct实践
- Android系统(2)---init.rc知识
- Sketch vs. Figma vs. adobe xd:哪个设计工具最适合初学者?
- spring boot2 坑 - 解决cros跨域问题
- HUST 1585 排队
- PHP学习笔记--array_map函数
- sqlserver备份还原丢失dbo_编程实现备份和还原数据库_sqlserver
- jQuery实现选择“学科门类”、“学科大类(一级学科)”、“专业”(二级学科)实现三级联动
- baidupcsgo安卓_GitHub - orenbek2019/BaiduPCS-Go: 百度网盘客户端 - Go语言编写
- 关于soundfile写音频是报错raise RuntimeError(prefix + _ffi.string(err_str).decode(‘utf-8‘, ‘replace‘))
- UE4中实现鼠标单选空间中的模型、Ctrl键多选、空间打点框选功能。
- 题目内容: 你的程序要读入一系列正整数数据,输入-1表示输入结束,-1本身不是输入的数据。程序输出读到的数据中的奇数和偶数的个数。 输入格式: 一系列正整数,整数的范围是(0,100000)。如果输入
- 基于JAVASEOUL设计师品牌代购商城计算机毕业设计源码+系统+lw文档+部署
- BCD码指令 AAA DAA AAS DAS AAM AAD
- GAMS系列分享12—GAMS基础知识——模型和求解
- 【SRE笔记 2022.9.21 网络及TCP握手】
热门文章
- Java 自动装箱与拆箱(Autoboxing and unboxing)
- 二分图最大匹配的经典匈牙利算法
- SameMovie HBOMax Video Downloader for Mac如何在 Mac 上下载 HBO Max 视频?
- 如何使用Super Vectorizer在 Mac 上将 PDF 转换为 SVG 矢量?
- Dato for Mac(菜单栏时钟工具)支持m1
- 通过Spring Boot中的手动Bean定义提高启动性能
- Linux IPC udp/ip socket 编程
- JS的内建函数reduce
- [裴礼文数学分析中的典型问题与方法习题参考解答]4.3.17
- css 样式文字溢出显示省略号