`
masterzs
  • 浏览: 17480 次
  • 性别: 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.rar_java chm_jdk_jdk1.70 api_jdk1.70-03_site:en.pudn.com

    对于深入学习JDK 1.70 API,除了查阅CHM文档,还可以参考以下资源: 1. Oracle官方教程:Oracle官网提供了丰富的Java学习资源,包括详细的教程和实例。 2. Java社区:Stack Overflow、CSDN、GitHub等社区有大量...

    jdk6 windows 32位.rar

    5. **学习资源**:有许多在线教程、文档和论坛资源可以帮助开发者学习和解决问题,如Oracle的官方文档、Stack Overflow问答网站等。 总的来说,JDK 6 32位是Java开发历史上的一个重要版本,虽然现在已经较旧,但在...

    jdk1.9百度网盘下载地址

    另外还提供了一个新的类`StackWalking`用于执行堆栈行走操作,以帮助实现更高效的异常处理。 #### 6. HTTP客户端API 尽管该API仍处于实验阶段,但它为开发人员提供了构建HTTP客户端应用的新选择,相比传统的`...

    java-jdk11版本jar包下载

    - 在线教程、论坛和社区,如Stack Overflow、GitHub等,都是获取帮助和解决问题的好地方。 7. **性能优化**: - JDK 11通过一系列性能优化提升了JVM的效率,包括ZGC的引入,使得大型应用的内存管理更加高效。 8....

    Java+JDK+6学习笔记.pdf

    ### Java+JDK+6 学习笔记知识点详解 #### 一、Java 概述 - **起源与发展:** - Java 最初是由 Sun Microsystems 的 Green Project 开发出来的编程语言,最初是为了创建一个名为 Star7 的应用程序。 - 1995 年 5 ...

    MQTT客户端paho 对应的java环境JDK

    5. **社区求助**:如果以上步骤都无法解决问题,可以在开源社区(如GitHub或Stack Overflow)提问,提供详细错误信息,寻求社区的帮助。 在提供的压缩包"JDK_paho"中,应该包含了一套与Paho MQTT客户端兼容的JDK。...

    安装jdk时遇到当前页面脚本错误的报错,下载这个版本的jdk解决

    8. **社区支持**:如果以上步骤都未能解决问题,你可以在Java开发者社区、Oracle官方论坛或者Stack Overflow等技术问答平台搜索类似问题,看看是否有其他人遇到过相同问题并找到了解决方案。 总之,解决这类问题...

    良葛格Java JDK 5.0学习笔记

    本文将深入探讨Java JDK 5.0中的关键知识点,包括其主要特性、学习方法、环境配置以及核心概念。 一、Java JDK 5.0的主要特性 1. 自动装箱与拆箱:Java 5.0引入了自动装箱和拆箱机制,使得基本类型和它们对应的...

    linux版JDK1.8

    - Linux和Java都有庞大的开发者社区,遇到问题时可以通过Stack Overflow、GitHub等平台寻求帮助。 总之,Linux版JDK 1.8是Linux开发者进行Java开发不可或缺的工具,其稳定性和性能得到了广泛认可。安装和使用过程...

    ubuntu 18.04编译JDK 12源码包

    在本文中,我们将深入探讨如何在Ubuntu 18.04操作系统上编译JDK 12的源码包。...通过这个过程,你可以学习到软件构建流程,了解Java虚拟机的工作原理,以及如何利用开源项目进行自定义配置。祝你在编译旅程中一切顺利!

    jdk9官方压缩包64位

    JDK9引入的模块系统是其最核心的功能之一。模块系统允许开发者定义自己的模块,这些模块可以包含其他模块或依赖关系。每个模块都有一个模块描述文件(module-info.java),其中定义了模块名称、导出的包以及所需的...

    JDK开发环境

    **JDK开发环境详解** Java Development Kit(JDK)是Oracle公司提供的用于开发和运行Java应用程序的工具包,...无论你是初学者还是经验丰富的开发者,持续学习和探索JDK的每一个角落都将对你的Java编程事业大有裨益。

    Android下各语言加callStack示例

    为了在Android设备上实际操作这些示例,你需要准备一个Android开发环境,安装NDK(用于C/C++)、JDK(用于Java)和必要的工具链。在你的项目中创建相应的C、C++、Java代码段,并确保正确配置编译选项。在运行时,...

    JDK虚拟内存增加

    在深入探讨如何通过调整JDK(Java Development Kit)虚拟机参数来优化内存配置,从而提升应用程序性能之前,我们首先需要理解这些参数的意义及其对Java应用运行时的影响。 ### JDK虚拟机内存模型概述 JVM(Java ...

    ANDRIOID+ECLIPSE+JDK+SDK

    - Stack Overflow:解答开发过程中遇到的具体问题。 - Google开发者社区:与其他开发者交流经验,分享知识。 理解并掌握这些知识点,开发者就能够构建一个完整的Android开发环境,开始创建和调试Android应用程序...

    jdk13 java13 jdk-13_windows-x64_bin.zip

    - 要深入学习JDK13,可以查阅Oracle官方文档,了解新特性的详细说明和使用示例。 - 在线教育平台、技术博客和社区论坛(如Stack Overflow)也是获取教程和解答问题的好去处。 - 实践是最好的老师,通过编写实际...

    jdk 配置手册 jdk配置问题

    通过阅读《JDK工具的使用(持续更新)_心亦如慧_新浪博客.htm》、CSDN社区的讨论以及百度知道的解答,你可以更深入地学习JDK配置的细节和技巧。同时,《java环境变量设置_百度知道.mht》、《java设置-JDK环境变量的...

    jdk-11_windows-x64_bin.zip

    - Oracle官方文档是学习和参考JDK 11的最佳资源,详细介绍了所有新特性和API变更。 - 社区论坛和博客,如Stack Overflow和Medium,提供了丰富的实践经验和解决方案。 通过上述步骤,你可以在Windows x64平台上...

    java自动环境配置jdk以及检测文件.zip

    5. 查阅相关文档或在线教程,寻求解决方案,社区如Stack Overflow通常有很多类似问题的解答。 总的来说,Java环境的自动配置和检测是一个重要的步骤,对于初学者和开发者来说,了解这个过程可以帮助他们更顺利地...

Global site tag (gtag.js) - Google Analytics