List小结
2015-06-15 16:18
357 查看
List接口继承自Collection接口,直接或者间接实现List接口的容器类有ArrayList、LinkedList、Vctor等,下面从源码看下这些容器的差别。
ArrayList主要依靠Object数组来存储元素,但它能够灵活地改变尺寸,先看下add方法
容量不足时先扩展一半的容量,超过限度直接到hugeCapacity().
remove()方法
删除元素后会调整原先容器元素位置。
LinkedList:
元素通过双向链表来存储,节点:
添加元素:
可见增删元素LinkedList会比较有优势。
Vector:Vector里的方法都是加锁的,理论上实现了线程安全,但已经不推荐用了。
public class ArrayList<E> extends AbstractList<E> implements List<E>, RandomAccess, Cloneable, java.io.Serializable
private transient Object[] elementData;
ArrayList主要依靠Object数组来存储元素,但它能够灵活地改变尺寸,先看下add方法
public boolean add(E e) { ensureCapacityInternal(size + 1); // Increments modCount!! elementData[size++] = e; return true; }
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); }
容量不足时先扩展一半的容量,超过限度直接到hugeCapacity().
remove()方法
public E remove(int index) { rangeCheck(index); modCount++; E oldValue = elementData(index); int numMoved = size - index - 1; if (numMoved > 0) System.arraycopy(elementData, index+1, elementData, index, numMoved); elementData[--size] = null; // clear to let GC do its work return oldValue; }
删除元素后会调整原先容器元素位置。
LinkedList:
元素通过双向链表来存储,节点:
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; } }
添加元素:
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++; }
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; }
可见增删元素LinkedList会比较有优势。
Vector:Vector里的方法都是加锁的,理论上实现了线程安全,但已经不推荐用了。
相关文章推荐
- Java 重入锁 ReentrantLock
- 数据库第九章作业
- TFS使用文档-部署篇
- 第十五周 阅读程序(1)
- HTTP cookies 详解
- MVC3+EF4.1学习系列(十一)----EF4.1常见的问题解决
- (转) 一个例子让你了解Java反射机制
- IOS开发—通过ChildViewController实现view的切换
- Android JSON数据解析(GSON方式)
- ant打包war时报错:java.lang.IllegalArgumentException: MALFORMED
- 迈入而立之前,理清一下自己
- 【作业一】林轩田机器学习基石
- Html.TextBoxFor三元判断
- 日常
- 想个头啊
- Eclipse在线安装fatjar插件
- 基于MVC4+EasyUI的Web开发框架形成之旅
- 6. 创建版本库
- 设计模式
- hdu 2444 The Accomodation of Students 【二分图判断+求最大匹配】