赞
踩
架构图
Collection接口包含了集合的基本操作和属性,包含了List和Set两大分支。工具类(Iterator,Arrays,Collections)
iterator迭代器
Arrays和Collections常用API
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
// replace with empty array.
this.elementData = EMPTY_ELEMENTDATA;
}
}
public boolean add(E e) { //确保数组有合适的大小 ensureCapacityInternal(size + 1); elementData[size++] = e; return true; } public void add(int index, E element) { //检查插入位置索引是否合法 rangeCheckForAdd(index); ensureCapacityInternal(size + 1); // Increments modCount!! //将elementData中index插入位置以后的所有节点的下标+1 System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = element; size++; }
private void ensureCapacityInternal(int minCapacity) { // 判断数组是否初始化长度 if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) { // 默认值与最小容量取较大值 minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity); } ensureExplicitCapacity(minCapacity); } private void ensureExplicitCapacity(int minCapacity) { modCount++; if (minCapacity - elementData.length > 0) grow(minCapacity); } private void grow(int minCapacity) { int oldCapacity = elementData.length; // 旧容量 int newCapacity = oldCapacity + (oldCapacity >> 1); // 新容量为旧容量的1.5倍 if (newCapacity - minCapacity < 0) // 新容量小于最少容量,将新容量设置为最小容量。例如初始化长度为1,扩容后依然是1。 newCapacity = minCapacity; if (newCapacity - MAX_ARRAY_SIZE > 0) // 新容量大于最大容量 newCapacity = hugeCapacity(minCapacity); // 指定新容量 // 拷贝扩容 elementData = Arrays.copyOf(elementData, newCapacity); //长度超过最大长度时调用的方法 private static int hugeCapacity(int minCapacity) { if (minCapacity < 0) // overflow throw new OutOfMemoryError(); return (minCapacity > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE; }
public E get(int index) {
//检查输入的索引是否合法
rangeCheck(index);
return elementData(index);
}
private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
E elementData(int index) {
//去存储数据的数组中由下表获取
return (E) elementData[index];
}
public E set(int index, E element) {
//检查输入的索引是否合法
rangeCheck(index);
//数组对应下标值的替换
E oldValue = elementData(index);
elementData[index] = element;
return oldValue;
}
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);
// 赋值为空,有利于进行GC
elementData[--size] = null;
// 返回旧值
return oldValue;
}
remove会将移除点之后的所有元素向前移动一位,并采用复制数组的方式建立新数组,并将最后一位设置为null有利于GC,如果移除的正好是最后一位则直接将它设置为Null
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length;
// 扩容为原长度的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 指向新数组
elementData = Arrays.copyOf(elementData, newCapacity);
}
private class Itr implements Iterator<E> { int cursor; // 索引光标 int lastRet = -1; // 最后返回的节点索引 int expectedModCount = modCount; public boolean hasNext() { //当前索引光标等于size时表示没有下一个了 return cursor != size; } @SuppressWarnings("unchecked") public E next() { //检查modCount,fail-fast机制 checkForComodification(); int i = cursor; if (i >= size) throw new NoSuchElementException(); Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) throw new ConcurrentModificationException(); //光标向前移一位 cursor = i + 1; return (E) elementData[lastRet = i]; } public void remove() { if (lastRet < 0) throw new IllegalStateException(); checkForComodification(); try { ArrayList.this.remove(lastRet); cursor = lastRet; lastRet = -1; expectedModCount = modCount; } catch (IndexOutOfBoundsException ex) { throw new ConcurrentModificationException(); } } }
Vector和ArrayList十分类似,最大的区别在于它是线程安全的,在操作集合的方法上使用synchronized关键字。
这里只列出与ArrayList不同的地方。
//存储数据的Object数组
protected Object[] elementData;
//元素数量即Vector的size
protected int elementCount;
//每次扩容时的增量大小
protected int capacityIncrement;
//序列化id
private static final long serialVersionUID = -2767605614048989439L;
//无参构造,默认初始化长度为10,与jdk1.7以前的ArrayList空参构造相同 public Vector() { this(10); } //指定长度的Vector构造方法,增量设置为0,后续使用grow()进行扩容 public Vector(int initialCapacity) { //调用另一个构造 this(initialCapacity, 0); } //指定长度和扩容增量的构造方法 public Vector(int initialCapacity, int capacityIncrement) { super(); if (initialCapacity < 0) throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); this.elementData = new Object[initialCapacity]; this.capacityIncrement = capacityIncrement; }
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);
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。