`
masterzs
  • 浏览: 16984 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JDK学习之Stack

阅读更多

今天我们学习一下JDK中栈的实现,栈也是一种基本的数据结构,遵循后进先出(LIFO),废话少说,先看一下UML继承关系。

1,UML继承关系图:

 

 

这里我们看到其主要继承Vector,下边我们看下其主要方法的实现方式。

 

2,JDK中主要方法的实现方式

增加一条记录,push(E item)

 

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

	return item;
    }

内部调用addElement(item)方法,这个方法是继承自Vector,我们看下addElement方法的具体实现:

    public synchronized void addElement(E obj) {
	modCount++;
	ensureCapacityHelper(elementCount + 1);
	elementData[elementCount++] = obj;
    }

 

再看下ensureCapacityHelper方法:

  private void ensureCapacityHelper(int minCapacity) {
	int oldCapacity = elementData.length;
	if (minCapacity > oldCapacity) {
	    Object[] oldData = elementData;
	    int newCapacity = (capacityIncrement > 0) ?
		(oldCapacity + capacityIncrement) : (oldCapacity * 2);
    	    if (newCapacity < minCapacity) {
		newCapacity = minCapacity;
	    }
	    elementData = new Object[newCapacity];
	    System.arraycopy(oldData, 0, elementData, 0, elementCount);
	}
    }

 

可以看到其内部使用数组来实现,跟ArrayList是相同的,区别是addElement方法前加了synchronized修饰符,给调用这个方法的对象加了一把锁,防止同一时间多个对象访问这个方法,保证的线程安全,但是会带来很大的系统开销。

弹出一条数据,pop():

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

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

	return obj;
    }

 调用的peek方法

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

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

 

 直接返回数组的最后一条记录,即最后压入的数据项,同样是同步方法;

查找一条记录,search(Object o) :

 

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

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

  调用了父类的lastIndexOf()方法:

    public synchronized int lastIndexOf(Object elem, int index) {
        if (index >= elementCount)
            throw new IndexOutOfBoundsException(index + " >= "+ elementCount);

	if (elem == null) {
	    for (int i = index; i >= 0; i--)
		if (elementData[i]==null)
		    return i;
	} else {
	    for (int i = index; i >= 0; i--)
		if (elem.equals(elementData[i]))
		    return i;
	}
	return -1;
    }

 

实现方法同ArrayList(参考JDK学习之ArrayList http://masterzs.iteye.com/blog/635792)。

3 典型应用:

回文,输入一串字符串,反方向打印出来,

 

 

            Stack stack = new Stack();
                Scanner scanner=new Scanner(System.in);   
	System.out.print("Please input some character:");   
	 String inputString=scanner.next();  //获取字符串值   
	 System.out.println("The string you input is:  "+inputString+" ");   		
	        for(int index =0;index<= inputString.length()-1;index++){
		stack.push(inputString.charAt(index));
	 		
	                                        }
	System.out.print("The string you input Reverse is: ");
	while(stack.size()!=0)
	             System.out.print(stack.pop());
			
	}

 

 

 4,总结

在实际项目中从未使用过:(,Java的栈帧用于存储方法调用的状态,栈的特点是存取速度快,一般存储运行时程序的状态,调用方法的参数,返回值,状态信息之类的运行参数,

具体项目中很少用到。
 

  • 大小: 27.3 KB
2
0
分享到:
评论

相关推荐

    jdk.API 1.6 -1.9中文版.zip

    内含 JAVA_API_1.7中文 , JDK 1.6 API,jdk1.8中文百度 ,jdk-9_汉化版等

    jdk-8u181-windows-x64.zip

    JDK 8U181 Windows x64 ...3、更好的 stack walking 4、修复无法在 JDK 8 中使用 JDWP API 来调试 JDK&gt;= 9 的问题 5、修复 JVM 在 G1 GC 期间崩溃的问题 6、引入较旧的 NUMA 库(-XX + UseNuma)以提高稳定性

    mac jdk-8u241

    You can use it to create Java applications and includes the new JavaFX 2.2 client stack. The developer version however does not include a plugin to launch Java applications from the browser so applet...

    jdk-11.0.5_windows-x64_bin.exe

    jdk-11.0.5_windows-x64_bin.exe,官方下载java 11.0.5版本,免去登录账号。

    JDK 16 来了1

    本次版本特性列表中我比较关注以下几项:1)ZGC: Concurrent Thread-Stack ProcessingZGC在JDK 15中已经正式成为生产特

    jcmd:JDK14中的调试神器

    文章目录简介jcmd的语法列出运行的JVM打印stack信息打印heap info打印heap dump统计heap使用情况JFR功能总结 简介 jcmd是JDK自带的调试工具,具有非常强大的功能。jcmd是JDK7中正式引入的,有了jcmd,完全可以替换很...

    jdk7+ubuntu14.04_32位下编译的hadoop2.6.0的libhadoop.so.1.0.0

    jdk7+ubuntu14.04_32位下编译的hadoop2.6.0的libhadoop.so.1.0.0 hadoop-2.6.0 默认系统是64位的,要想在32位系统下运行需重新编译 这个是编译好的文件(注意环境),替换hadoop-2.6.0/lib/native/libhadoop.so....

    saltstack-java-formula:Salt Stack公式可用于设置和配置Java JRE,JDK等

    SaltStack公式可用于设置和配置Java JRE,JDK等 指示 请参考以了解如何使用此公式,如何构建该公式以及如何添加更改。 注意:此公式可能使用formhelper模块,这是一个非常有用的Salt执行模块,尚无法在上游使用。 ...

    extended-stacktrace:JVM的增强堆栈跟踪

    用法使用./gradlew克隆并构建存储库,或者使用co.paralleluniverse:extended-stacktrace:0.1.0-SNAPSHOT快照存储库( https://oss.sonatype.org/content/repositories/snapshots )中的Maven工件co.paralleluniverse...

    one in stack full beta

    lnmt(Linux + Nginx+ MySQL+ Tomcat):Nginx处理静态,Tomcat(JDK)处理JAVA lnmh(Linux + Nginx+ MySQL+ HHVM) http://mirrors.linuxeye.com/oneinstack-full-beta.tar.gz. #完整版下载 包含COS备份 ...

    jgroups-stack-set:使用JGroups的Stack and Set实现

    会员13512014穆罕默德·亚菲13512066卡尔文·萨德瓦(Calvin Sadewa)先决条件安装Java JDK 1.8 安装Gradle,将其添加到PATH环境变量中。 通过在命令提示符下键入gradle ,确保gradle可以正常工作。运行jar文件在根...

    javastacks#javastack#终于,Spring 5.0 正式发布了!1

    1、最低要求支持JDK8+, J2EE 7+ 2、移除了一些包、类及方法 3、核心功能加强:全面应用jdk8并兼容jdk9等 4、SpringMVC:支持ser

    java-stack-trace

    由于asm的限制,仅支持jdk1.8及以上 编译 mvn package 用法 在java命令后添加-javaagent参数 -javaagent:java-stack-trace-1.0-SNAPSHOT-jar-with-dependencies.jar=[m:method name|f:file name] 方法前缀可以用m:...

    Java小假期第一次作业

    1. 发现错误并改错。给出一个实现插入排序的程序,文件名为...禁止使用JDK自带的Base64转换程序以及Apache开源网站上的程序, 必须自己编写代码来实现BASE64编码和解码函数。可以为该类添加其他数据成员和函数成员。

    chatbot-java:使用Java Stack实现的Web聊天机器人概念证明

    使用Java Stack实现的Web聊天机器人概念证明 该项目是标准的Maven项目,因此您可以将其导入到您选择的IDE中。 您需要安装Java 11+和Node.js 10+。 要从命令行运行,请使用./mvnw spring-boot:run并在浏览器中打开 ...

    MyJavaSIP1.7_for_Eclipse

    是MyJavaSIP1.7在eclipse中...If you are interested in all java source files of the mjsip stack (v1.7) and reference applications (mjProxy v1.7, mjSBC v1.7, and mjUA v1.7), you can download them from here

    spring-framework-4.1.6.RELEASE-dist

    Spring Framework 是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架,以Apache许可证形式发布,也有.NET平台上的移植版本。 该框架基于 Expert One-on-One Java EE Design and Development(ISBN 0-...

    matlabr2012b代码-vdpgm_stack:为KenichiKurihara的matlab代码提供ROS接口,用于变分Dirichl

    R2012b代码vdpgm_stack 为Kenichi Kurihara的matlab代码提供ROS接口,用于变分Dirichlet过程高斯混合模型 安装说明 安装matlab版本R2012b或等效的MCR。 确保您使用的是Java jdk 6(rosjava_core当前不会使用jdk 7...

    stack-machine:堆垛机

    可以直接启动应用程序mvn spring-boot:run如果要从源代码创建JAR文件,请运行以下命令mvn clean package将在“目标”文件夹中创建一个JAR文件,并可以通过以下命令执行java -jar stack-machine-&lt;artifact&gt;.jar命令...

    和平之翼代码生成器SMEU Swing单机1.1版

    在装好JDK或JRE的计算机上双击即可执行。 也可在命令窗口以java -jar PeaceWingSMEU_Swing_1_1.jar运行。 和平之翼代码生成器是一种易用的动词算子式代码生成器。是 无垠式Java通用代码生成器的第二代。 无垠式/和平...

Global site tag (gtag.js) - Google Analytics