ArrayList和LinkedList和Vector源码分析
2015-01-27 21:29
603 查看
ArrayList源码:
LinkedList源码:
LinkedList还有linkBefore、linkFirst...等等其他方法。
Vector源码:
Vector的三个构造函数
list和set的toString方法是在AbstractCollection类重写了。
总结:LinkedList插入快,查询慢,ArrayList查询快,插入慢,扩容长度为原来的一半,可以给定数组长度。Vector可以给定长度和扩容步长。没有给定步长,扩容一倍,给定了,每次增加步长。
private static final int DEFAULT_CAPACITY = 10;//默认长度 /** * Shared empty array instance used for empty instances. */ private static final Object[] EMPTY_ELEMENTDATA = {}; //默认数组 /** * The array buffer into which the elements of the ArrayList are stored. * The capacity of the ArrayList is the length of this array buffer. Any * empty ArrayList with elementData == EMPTY_ELEMENTDATA will be expanded to * DEFAULT_CAPACITY when the first element is added. */ private transient Object[] elementData; //存放数据的数组 /** * The size of the ArrayList (the number of elements it contains). * * @serial */ private int size; /** * Constructs an empty list with an initial capacity of ten. */ public ArrayList() { super(); this.elementData = EMPTY_ELEMENTDATA; } public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! 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 code if (minCapacity - elementData.length > 0) grow(minCapacity); } private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; 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); }
LinkedList源码:
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;//第一个添加进来的作为第一个节点 else l.next = newNode;//记住下一个节点 size++; modCount++; }
LinkedList还有linkBefore、linkFirst...等等其他方法。
Vector源码:
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); }
Vector的三个构造函数
//同步方法 public synchronized boolean add(E e) { modCount++; ensureCapacityHelper(elementCount + 1); elementData[elementCount++] = e; return true; } private void ensureCapacityHelper(int minCapacity) { // overflow-conscious code //判断是否需要扩容 if (minCapacity - elementData.length > 0) grow(minCapacity); } private void grow(int minCapacity) { // overflow-conscious code int oldCapacity = elementData.length; 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); }
list和set的toString方法是在AbstractCollection类重写了。
总结:LinkedList插入快,查询慢,ArrayList查询快,插入慢,扩容长度为原来的一半,可以给定数组长度。Vector可以给定长度和扩容步长。没有给定步长,扩容一倍,给定了,每次增加步长。
相关文章推荐
- java中List接口的实现类 ArrayList,LinkedList,Vector 的区别 list实现类源码分析
- java中List接口的实现类 ArrayList,LinkedList,Vector 的区别 list实现类源码分析
- 常用集合ArrayList,LinkedList,HashMap,HashSet源码分析
- Java中arraylist和linkedlist源码分析与性能比较
- ArrayList和LinkedList源码分析
- Java 深入学习(2) —— ArrayList、LinkedList、Vector 应用场景与性能分析
- 集合框架源码分析三(实现类篇ArrayList,LinkedList,HashMap)
- ArrayList和LinkedList源码分析总结
- 集合框架源码分析三(实现类篇ArrayList,LinkedList,HashMap)
- Java集合分析:ArrayList、LinkedList、Vector
- java基础解析系列(十)---ArrayList和LinkedList源码及使用分析
- java非并发容器ArrayList 和 LinkedList 优缺点比较及其实现源码分析
- 集合框架源码分析三(实现类篇ArrayList,LinkedList,HashMap)
- ArrayList 和 LinkedList 源码分析
- Java ArrayList、LinkedList和Vector的使用及性能分析
- Java集合源码学习笔记(五)ArrayList,LinkedList,Vector和Hashtable,HashMap的比较
- ArrayList和LinkedList add的源码分析
- 源码分析二(ArrayList与LinkedList的区别)
- 分析Java中ArrayList与LinkedList列表结构的源码
- 浅析Java集合类源码(一)--- Vector, ArrayList, LinkedList