概述
安琪拉正在梳理Java知识体系,这篇讲Java集合的Stack。如果希望获取完整的《安琪拉Java知识体系》整理中, 完成后公众号回复“知识体系” 即可获取。
完整的Java集合如下图所示:
这次讲Stack。
Stack翻译过来是栈,栈最大的特点就是先进后出,Stack继承自Vector,因此和Vector一样,底层数据结构也是数组,除了Vector 提供的方法,Stack 提供了栈需要的一些方法。
如下:
- 构造方法:
public Stack() {
} // 空的,没有预先初始化
- 压栈方法
因为底层数据结构是数组,实际压栈就是把元素放到数组尾部。
public E push(E item) {
// addElement 用的是继承自 Vector的方法
addElement(item);
return item;
}
// Class Vector
public synchronized void addElement(E obj) {
modCount++;
//确保容量够
ensureCapacityHelper(elementCount + 1);
//元素放到数组尾部
elementData[elementCount++] = obj;
}
- 栈弹出
基本原理就是把数组尾部元素移除,把元素返回。
直接看代码:
public synchronized E pop() {
E obj;
int len = size();
//直接取数组尾部元素
obj = peek();
//移除数组最后一个元素
removeElementAt(len - 1);
return obj;
}
public synchronized E peek() {
//获取数组总长,总长-1 就是最后一个元素的下标
int len = size();
if (len == 0)
throw new EmptyStackException();
return elementAt(len - 1);
}
这里可能要好好讲讲 removeElementAt(index) 这个方法。
这个方法作用是移除数组的指定index 下标的元素,也是Vector 的方法,如下:
// 加synchronized 线程安全方法
public synchronized void removeElementAt(int index) {
modCount++;
// 校验index 是否超出数组范围 < 0 或者 >= elementCount 元素数量都是超出范围的
if (index >= elementCount) {
throw new ArrayIndexOutOfBoundsException(index + " >= " +
elementCount);
}
else if (index < 0) {
throw new ArrayIndexOutOfBoundsException(index);
}
// 直接看后面的看图讲解
int j = elementCount - index - 1;
if (j > 0) {
System.arraycopy(elementData, index + 1, elementData, index, j);
}
elementCount--;
elementData[elementCount] = null; /* to let gc do its work */
}
如上图,现在我们有个数组,elementData(数组长度)是5,现在要删除下标 index = 2 的元素,方法是把index = 2 后面的元素都往前移动一个,然后把数组最后的元素置空。
// 把elementData数组从index + 1往后的j 个元素都拷贝到index 这个位置上来,这里j 就是算有index 后面元素个数, j = elementCount - index - 1;
代码:
System.arraycopy(elementData, index + 1, elementData, index, j);
然后把数组最后的元素置空,代码:
elementCount--;
elementData[elementCount] = null;
这样方便下次GC的时候回收。
最后
以上就是年轻花生为你收集整理的Java集合之Stack(出自Java知识体系)的全部内容,希望文章能够帮你解决Java集合之Stack(出自Java知识体系)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复