Java集合之Stack(出自Java知识体系)

安琪拉正在梳理Java知识体系,这篇讲Java集合的Stack。如果希望获取完整的《安琪拉Java知识体系》整理中, 完成后公众号回复“知识体系” 即可获取。

完整的Java集合如下图所示:
Java集合类
这次讲Stack。

Stack翻译过来是栈,栈最大的特点就是先进后出,Stack继承自Vector,因此和Vector一样,底层数据结构也是数组,除了Vector 提供的方法,Stack 提供了栈需要的一些方法。
如下:
Stack

  1. 构造方法:
    public Stack() {
    } // 空的,没有预先初始化
  1. 压栈方法
    因为底层数据结构是数组,实际压栈就是把元素放到数组尾部。
	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;
    }
  
  1. 栈弹出
    基本原理就是把数组尾部元素移除,把元素返回。
    直接看代码:
    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的时候回收。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值