资讯专栏INFORMATION COLUMN

Java中的栈

henry14 / 1373人阅读

摘要:中的栈中的是早期的遗留类,已经不推荐使用,现在只是为了兼容遗留代码而保留遗留实现如下面的代码所示,中的实现是基于动态数组实现的,而同样是一个被废弃的类。

Java中的栈

Java中的Stack是早期的遗留类,Sun/Oracle已经不推荐使用,现在只是为了兼容遗留代码而保留.

遗留实现

如下面的代码所示,java.util.Stack中的实现是基于动态数组实现的,而Vector同样是一个被废弃的类。

个人看来,这个实现有两个问题

基于Vector,需要同步因而性能损失很严重

基于数组而非链表,栈很大时需要多次扩容,带来不必要的性能损失

public
class Stack extends Vector {
    /**
     * Creates an empty Stack.
     */
    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;
    }

    /** use serialVersionUID from JDK 1.0.2 for interoperability */
    private static final long serialVersionUID = 1224463164541339165L;
}
自己简单的封装

下面是基于LinkedList封装的Stack

这里的栈是一个装饰器。

import java.util.LinkedList;
import java.util.NoSuchElementException;

public class Stack {
    private LinkedList stack;

    Stack() {
        stack = new LinkedList<>();
    }

    public void push(T o) {
        stack.add(o);
    }

    public T pop() {
        if (size() <= 0) {
            throw new NoSuchElementException("Stack is Empty.");
        }
        return stack.removeLast();
    }

    public T peek() {
        if (size() <= 0) {
            throw new NoSuchElementException("Stack is Empty.");
        }
        return stack.getLast();
    }

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

    public int size() {
        return stack.size();
    }
}

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73986.html

相关文章

  • java的栈

    摘要:对于执行引擎来说,在活动线程中,只有位于栈顶的栈帧才是最有效的称为当前栈帧与这个栈帧相关联的方法称为当前方法。执行引擎运行的所有的字节码指令都只针对当前栈帧进行操作。 showImg(https://segmentfault.com/img/bVbvueY?w=1600&h=800); 栈帧数据结构 栈帧(Stack Frame)是用来支持虚拟机进行方法调用和方法执行的数据结构,它是虚...

    jeyhan 评论0 收藏0
  • JVM体系结构与工作方式概览

    摘要:在本文,笔者将与大家概览的体系结构与工作方式。将第条和第条指令分别是将两个局部变量入栈,然后相加。最后一条指令是,这条指令执行完后当前的这个方法对应的这些部件会被回收,局部变量区的所有值将全部释放,寄存器会被销魂,在栈中与这个方 Java之所以号称一次编译,到处运行,主要原因是JVM屏蔽了各个计算机平台相关的软件(大多指系统)或者硬件之间的差异,使得与平台相关的耦合统一由JVM提供者来...

    suosuopuo 评论0 收藏0
  • JVM虚拟机详解

    摘要:虚拟机包括一套字节码指令集一组寄存器一个栈一个垃圾回收堆和一个存储方法域。而使用虚拟机是实现这一特点的关键。虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。此内存区域是唯一一个在虚拟机规范中没有规定任何情况的区域。 1、 什么是JVM?   JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,...

    rottengeek 评论0 收藏0
  • Java性能优化之JVM内存模型

    摘要:内存模型首先介绍下程序具体执行的过程源代码文件后缀会被编译器编译为字节码文件后缀由中的类加载器加载各个类的字节码文件,加载完毕之后,交由执行引擎执行在整个程序执行过程中,会用一段空间来存储程序执行期间需要用到的数据和相关信息,这段空间一般被 [TOC] JVM内存模型 首先介绍下Java程序具体执行的过程: Java源代码文件(.java后缀)会被Java编译器编译为字节码文件(....

    SQC 评论0 收藏0
  • 聊聊Java的异常机制及实现

    摘要:是那些可能在虚拟机正常运行期间抛出的异常的超类。运行时异常定义及其子类都被称为运行时异常。对于语言中的关键字和,虚拟机中并没有特殊的字节码指令去支持它们,都是通过编译器生成字节码片段以及不同的异常处理器来实现。 前言 在一些传统的编程语言,如C语言中,并没有专门处理异常的机制,程序员通常用方法的特定返回值来表示异常情况,并且程序的正常流程和异常流程都采用同样的流程控制语句。Java语言...

    Towers 评论0 收藏0

发表评论

0条评论

henry14

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<