当前位置: 首页 > news >正文

java Stack类 Vector类

为什么80%的码农都做不了架构师?>>>   hot3.png

java中的堆 Stack


package java.util;

public class Stack<E> extends Vector<E> {
   
    public Stack() {
    }

   
    public E push(E item) {
        addElement(item);

        return item;
    }

   
    public synchronized E pop() {
        E       obj;
        int     len = size();

        obj = peek();
        removeElementAt(len - 1);

        return obj;
    }

    public synchronized E peek() {
        int     len = size();

        if (len == 0)
            throw new EmptyStackException();
        return elementAt(len - 1);
    }

  
    public boolean empty() {
        return size() == 0;
    }

    public synchronized int search(Object o) {
        int i = lastIndexOf(o);

        if (i >= 0) {
            return size() - i;
        }
        return -1;
    }

}

Stack类 继承了Vector类

public class Vector<E>
    extends AbstractList<E>
    implements List<E>, RandomAccess, Cloneable, java.io.Serializable

通过阅读Vector类源码 发现

Vector方法大多数被synchronized修饰,线程安全

protected Object[] elementData;

实际用来保存数据的是一个Object数组,java的数组是不可变的,但是Vector确实不受长度限制的,这究竟是为什么呢?我们来看一下add()方法便能知道原因

    public synchronized boolean add(E e) {
        modCount++;
        ensureCapacityHelper(elementCount + 1);
        elementData[elementCount++] = e;
        return true;
    }

可以看到 在对elementData进行赋值操作之前,执行了ensureCapacityHelper方法

    private void ensureCapacityHelper(int minCapacity) {
        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
    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);
    }
    private static int hugeCapacity(int minCapacity) {
        if (minCapacity < 0) // overflow
            throw new OutOfMemoryError();
        return (minCapacity > MAX_ARRAY_SIZE) ?
            Integer.MAX_VALUE :
            MAX_ARRAY_SIZE;
    }

找到原因了吧, 当要操作的index大小超过elementData现在的大小时会执行grow方法, 这个方法会对elementData进行调整,生成一个新数组,并将原数组的值拷贝过去

获取 get(index) 调用

    E elementData(int index) {
        return (E) elementData[index];
    }

indexOf 没啥难度 不看了

    public synchronized int indexOf(Object o, int index) {
        if (o == null) {
            for (int i = index ; i < elementCount ; i++)
                if (elementData[i]==null)
                    return i;
        } else {
            for (int i = index ; i < elementCount ; i++)
                if (o.equals(elementData[i]))
                    return i;
        }
        return -1;
    }

接下来看删除方法

删除方法也都大同小异 只看remove方法

    public synchronized E remove(int index) {
        modCount++;
        if (index >= elementCount)
            throw new ArrayIndexOutOfBoundsException(index);
        E oldValue = elementData(index);

        int numMoved = elementCount - index - 1;
        if (numMoved > 0)
            System.arraycopy(elementData, index+1, elementData, index,
                             numMoved);
        elementData[--elementCount] = null; // Let gc do its work

        return oldValue;
    }

可以看到 System.arraycopy 会将index+1后面的值复制到index往后的位置,然后将elementCount位置的值改成空,并对elementCount进行--操作

##我们可以看到 Stack类本身只有5个方法,并且调用的都是父类的方法

  1. peek() 查看栈顶值 同步
  2. push() 压栈 同步
  3. pop() 出栈 同步
  4. empty() 查看大小是否为0
  5. search() 查找 同步

Stack的简单应用

前缀表达式转后缀表达式并计算

转载于:https://my.oschina.net/razox/blog/851819

相关文章:

  • 事件绑定的几种常见方式
  • Connection Quality Indicator-Citrix VDA连接质量诊断工具
  • spark 02 操作算子
  • 轻松使用二进制安装Mysql5.6
  • rman RMAN-06059: expected archived log not found
  • Window下JDK、Tomcat、eclipse安装与配置
  • Remove Untagged Images From Docker
  • Error creating bean with name 'adminUserController': Injection of autowired dependencies failed;
  • [技术选型] spring boot
  • 学习JavaScript数据结构与算法 — 树
  • shell第一列相同即判断为重复,只取其中一条数据
  • BZOJ 4767: 两双手 [DP 组合数]
  • linux 调试 之printf
  • 普通函数和构造函数的区别
  • jwplayer 隐藏属性方法记载
  • 【node学习】协程
  • 07.Android之多媒体问题
  • ES6简单总结(搭配简单的讲解和小案例)
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • iOS编译提示和导航提示
  • Java 最常见的 200+ 面试题:面试必备
  • JavaScript创建对象的四种方式
  • magento 货币换算
  • Python_网络编程
  • 小程序开发之路(一)
  • 一道闭包题引发的思考
  • 从如何停掉 Promise 链说起
  • 基于django的视频点播网站开发-step3-注册登录功能 ...
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #include到底该写在哪
  • $GOPATH/go.mod exists but should not goland
  • (pojstep1.3.1)1017(构造法模拟)
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (分享)自己整理的一些简单awk实用语句
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (算法)Travel Information Center
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • 、写入Shellcode到注册表上线
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .NET值类型变量“活”在哪?
  • @Async注解的坑,小心
  • @EnableAsync和@Async开始异步任务支持
  • @serverendpoint注解_SpringBoot 使用WebSocket打造在线聊天室(基于注解)
  • [20161101]rman备份与数据文件变化7.txt
  • [ABP实战开源项目]---ABP实时服务-通知系统.发布模式
  • [BZOJ] 2006: [NOI2010]超级钢琴
  • [FROM COM张]如何解决Nios II SBTE中出现的undefined reference to `xxx'警告
  • [HXPCTF 2021]includer‘s revenge
  • [iOS]GCD(一)
  • [JavaScript]_[初级]_[关于forof或者for...of循环语句的用法]
  • [NOIP2018 PJ T4]对称二叉树
  • [PTP][1588v2] Follow_Up消息
  • [Qt]QMainWindow
  • [Rust] 使用vscode实现HelloWorld程序并进行debug
  • [svc][op]关闭linux centos各种声音