Vector 和 Stack 的底层源码分析
Vector的底层源码:
研究思路:
1.研究继承关系
2.研究属性
3.理解创建集合的过程 – 构造方法的底层原理
4.研究添加元素的过程
场景:
public static void main(String[] args) {
//扩容机制是:数组原来长度 + 容量增量
//Vector<String> v = new Vector<>(10,5);
//扩容机制是:数组原来长度的2倍
Vector<String> v = new Vector<>();
v.add("aaa");
v.add("bbb");
v.add("ccc");
v.add("ddd");
}
}
1.研究继承关系
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
//外部操作数(计算添加和删除的次数)
protected transient int modCount = 0;//4
protected AbstractList() {
}
}
2.研究属性
//数组最大容量
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
//数据容器
protected Object[] elementData;
//元素个数
protected int elementCount;
//容量增量
protected int capacityIncrement;
3.理解创建集合的过程 – 构造方法的底层原理
public Vector() {
this(10);
}
//initialCapacity - 10
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
//initialCapacity - 10
//capacityIncrement - 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;
}
4.研究添加元素的过程
//添加方法
public synchronized boolean add(E e) {
modCount++;
//判断数组容器是否扩容
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
//minCapacity - 11
//判断是否扩容方法
private void ensureCapacityHelper(int minCapacity) {
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
//minCapacity - 11
//扩容方法
private void grow(int minCapacity) {
// oldCapacity - 10
int oldCapacity = elementData.length;
// newCapacity = 10 + 10
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);
}
//超大容量
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0)
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
5. Vector分析的总代码
public class Vector<E> extends AbstractList<E> implements List<E>{
//数组最大容量
private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;
//数据容器 - ["aaa","bbb","ccc","ddd",null,null,null,null,null,null]
protected Object[] elementData;//new Object[10];
//元素个数
protected int elementCount;//4
//容量增量
protected int capacityIncrement;//0
public Vector() {
this(10);
}
//initialCapacity - 10
public Vector(int initialCapacity) {
this(initialCapacity, 0);
}
//initialCapacity - 10
//capacityIncrement - 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;
}
// e - "ddd"
public synchronized boolean add(E e) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = e;
return true;
}
//minCapacity - 11
private void ensureCapacityHelper(int minCapacity) {
if (minCapacity - elementData.length > 0)
grow(minCapacity);
}
//minCapacity - 11
private void grow(int minCapacity) {
// oldCapacity - 10
int oldCapacity = elementData.length;
// newCapacity = 10 + 10
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);
}
private static int hugeCapacity(int minCapacity) {
if (minCapacity < 0)
throw new OutOfMemoryError();
return (minCapacity > MAX_ARRAY_SIZE) ?
Integer.MAX_VALUE :
MAX_ARRAY_SIZE;
}
}
6.深究
1.研究删除集合的过程
2.研究遍历集合的过程
7.面试题
Vector的底层数据结构是什么?
Object类型的一维数组
Vector的使用场景是什么?
在多线程下使用,因为Vector方法上加锁,是线程安全的集合
Vector的扩容机制是什么?
如果容量增量大于0,扩容机制是:数组原来长度 + 容量增量
如果容量增量小于等于0,扩容机制是:数组原来长度的2倍
Stack的底层源码:
研究思路:
1.研究继承关系
2.研究属性
3.理解创建集合的过程 – 构造方法的底层原理
4.研究添加元素的过程
场景:
public static void main(String[] args) {
Stack<String> stack = new Stack<>();
v.add("aaa");
v.add("bbb");
v.add("ccc");
v.add("ddd");
}
}
1.研究继承关系
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> {
//外部操作数(记录添加和删除的次数)
protected transient int modCount = 0;
}
public class Vector<E> extends AbstractList<E> implements List<E>{
public synchronized void addElement(E obj) {
modCount++;
ensureCapacityHelper(elementCount + 1);
elementData[elementCount++] = obj;
}
public synchronized int size() {
return elementCount;
}
public synchronized E elementAt(int index) {
if (index >= elementCount) {
throw new ArrayIndexOutOfBoundsException(index + " >= " + elementCount);
}
return elementData(index);
}
}
2.研究属性
3.理解创建集合的过程 – 构造方法的底层原理
public Stack() {
}
4.研究添加元素的过程
public E push(E item) {
addElement(item);//调用父类的addElement() -- 添加元素
return item;
}
5. Stack分析的总代码
public class Stack<E> extends Vector<E> {
public Stack() {
}
//item - "aaa"
public E push(E item) {
addElement(item);//调用父类的addElement() -- 添加元素
return item;
}
//删除栈顶元素
public synchronized E pop() {
E obj;
int len = size();//调用父类的size() -- 获取元素个数
obj = peek();//获取栈顶元素
//len - 1 表示最后一个元素的下标
removeElementAt(len - 1);//调用父类的removeElementAt() -- 删除最后一个元素
return obj;
}
public synchronized E peek() {
int len = size();//调用父类的size() -- 获取元素个数
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);//调用父类的elementAt() -- 获取指定下标上的元素
}
}
注意:
- 研究Stack底层是如何实现栈的数据结构。
- Stack底层所有的功能都依赖于父类Vector的方法,只不过Stack有自己的逻辑(栈)。