我是靠谱客的博主 年轻花生,最近开发中收集的这篇文章主要介绍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的时候回收。

最后

以上就是年轻花生为你收集整理的Java集合之Stack(出自Java知识体系)的全部内容,希望文章能够帮你解决Java集合之Stack(出自Java知识体系)所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(48)

评论列表共有 0 条评论

立即
投稿
返回
顶部