今天我们学习一下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
分享到:
相关推荐
内含 JAVA_API_1.7中文 , JDK 1.6 API,jdk1.8中文百度 ,jdk-9_汉化版等
对于深入学习JDK 1.70 API,除了查阅CHM文档,还可以参考以下资源: 1. Oracle官方教程:Oracle官网提供了丰富的Java学习资源,包括详细的教程和实例。 2. Java社区:Stack Overflow、CSDN、GitHub等社区有大量...
5. **学习资源**:有许多在线教程、文档和论坛资源可以帮助开发者学习和解决问题,如Oracle的官方文档、Stack Overflow问答网站等。 总的来说,JDK 6 32位是Java开发历史上的一个重要版本,虽然现在已经较旧,但在...
另外还提供了一个新的类`StackWalking`用于执行堆栈行走操作,以帮助实现更高效的异常处理。 #### 6. HTTP客户端API 尽管该API仍处于实验阶段,但它为开发人员提供了构建HTTP客户端应用的新选择,相比传统的`...
- 在线教程、论坛和社区,如Stack Overflow、GitHub等,都是获取帮助和解决问题的好地方。 7. **性能优化**: - JDK 11通过一系列性能优化提升了JVM的效率,包括ZGC的引入,使得大型应用的内存管理更加高效。 8....
### Java+JDK+6 学习笔记知识点详解 #### 一、Java 概述 - **起源与发展:** - Java 最初是由 Sun Microsystems 的 Green Project 开发出来的编程语言,最初是为了创建一个名为 Star7 的应用程序。 - 1995 年 5 ...
5. **社区求助**:如果以上步骤都无法解决问题,可以在开源社区(如GitHub或Stack Overflow)提问,提供详细错误信息,寻求社区的帮助。 在提供的压缩包"JDK_paho"中,应该包含了一套与Paho MQTT客户端兼容的JDK。...
8. **社区支持**:如果以上步骤都未能解决问题,你可以在Java开发者社区、Oracle官方论坛或者Stack Overflow等技术问答平台搜索类似问题,看看是否有其他人遇到过相同问题并找到了解决方案。 总之,解决这类问题...
本文将深入探讨Java JDK 5.0中的关键知识点,包括其主要特性、学习方法、环境配置以及核心概念。 一、Java JDK 5.0的主要特性 1. 自动装箱与拆箱:Java 5.0引入了自动装箱和拆箱机制,使得基本类型和它们对应的...
- Linux和Java都有庞大的开发者社区,遇到问题时可以通过Stack Overflow、GitHub等平台寻求帮助。 总之,Linux版JDK 1.8是Linux开发者进行Java开发不可或缺的工具,其稳定性和性能得到了广泛认可。安装和使用过程...
在本文中,我们将深入探讨如何在Ubuntu 18.04操作系统上编译JDK 12的源码包。...通过这个过程,你可以学习到软件构建流程,了解Java虚拟机的工作原理,以及如何利用开源项目进行自定义配置。祝你在编译旅程中一切顺利!
JDK9引入的模块系统是其最核心的功能之一。模块系统允许开发者定义自己的模块,这些模块可以包含其他模块或依赖关系。每个模块都有一个模块描述文件(module-info.java),其中定义了模块名称、导出的包以及所需的...
**JDK开发环境详解** Java Development Kit(JDK)是Oracle公司提供的用于开发和运行Java应用程序的工具包,...无论你是初学者还是经验丰富的开发者,持续学习和探索JDK的每一个角落都将对你的Java编程事业大有裨益。
为了在Android设备上实际操作这些示例,你需要准备一个Android开发环境,安装NDK(用于C/C++)、JDK(用于Java)和必要的工具链。在你的项目中创建相应的C、C++、Java代码段,并确保正确配置编译选项。在运行时,...
在深入探讨如何通过调整JDK(Java Development Kit)虚拟机参数来优化内存配置,从而提升应用程序性能之前,我们首先需要理解这些参数的意义及其对Java应用运行时的影响。 ### JDK虚拟机内存模型概述 JVM(Java ...
- Stack Overflow:解答开发过程中遇到的具体问题。 - Google开发者社区:与其他开发者交流经验,分享知识。 理解并掌握这些知识点,开发者就能够构建一个完整的Android开发环境,开始创建和调试Android应用程序...
- 要深入学习JDK13,可以查阅Oracle官方文档,了解新特性的详细说明和使用示例。 - 在线教育平台、技术博客和社区论坛(如Stack Overflow)也是获取教程和解答问题的好去处。 - 实践是最好的老师,通过编写实际...
通过阅读《JDK工具的使用(持续更新)_心亦如慧_新浪博客.htm》、CSDN社区的讨论以及百度知道的解答,你可以更深入地学习JDK配置的细节和技巧。同时,《java环境变量设置_百度知道.mht》、《java设置-JDK环境变量的...
- Oracle官方文档是学习和参考JDK 11的最佳资源,详细介绍了所有新特性和API变更。 - 社区论坛和博客,如Stack Overflow和Medium,提供了丰富的实践经验和解决方案。 通过上述步骤,你可以在Windows x64平台上...
5. 查阅相关文档或在线教程,寻求解决方案,社区如Stack Overflow通常有很多类似问题的解答。 总的来说,Java环境的自动配置和检测是一个重要的步骤,对于初学者和开发者来说,了解这个过程可以帮助他们更顺利地...