Java如何实现堆栈

Python027

Java如何实现堆栈,第1张

//这是JDK提供的栈

import java.util.Stack

public class UsingStack {

public static void main(String[] args) {

//构造栈对象,使用类型限制,只能存储Integer数据

Stack<Integer>s = new Stack<Integer>()

//1、2、3依次入栈

s.push(1)

s.push(2)

s.push(3)

//3、2、1依次出栈

System.out.println(s.pop())

System.out.println(s.pop())

System.out.println(s.pop())

}

}

//这是我写的顺序结构的栈

import java.util.EmptyStackException

import java.util.Vector

public class UsingStack{

public static void main(String[] args){

//构造栈对象,使用类型限制,只能存储Integer数据

MyStack<Integer>s = new MyStack<Integer>()

//1、2、3依次入栈

s.push(1)

s.push(2)

s.push(3)

//3、2、1依次出栈

System.out.println(s.pop())

System.out.println(s.pop())

System.out.println(s.pop())

}

}

/**

* 栈类

* @author developer_05

* @param <T>

*/

class MyStack<T>extends Vector<T>{

/**

* 构造方法

*/

public MyStack(){

}

/**

* 入栈方法

* @param item 待入栈的元素

* @return 返回入栈的元素

*/

public T push(T item) {

addElement(item)

return item

}

/**

* 出栈方法(同步处理)

* @return 返回出栈元素

*/

public synchronized T pop() {

T obj

int len = size()

if (len == 0)

throw new EmptyStackException()

obj = elementAt(len - 1)

removeElementAt(len - 1)

return obj

}

/**

* 判断栈是否为空的方法

* @return 返回true(栈空)或false(栈非空)

*/

public boolean empty() {

return size() == 0

}

private static final long serialVersionUID = 1L

}

Java堆(Java Heap)是java虚拟机所管理的内存中最大的一块

java堆被所有线程共享的一块内存区域

虚拟机启动时创建java堆

java堆的唯一目的就是存放对象实例。

java堆是垃圾收集器管理的主要区域。

从内存回收的角度来看, 由于现在收集器基本都采用分代收集算法, 所以Java堆可以细分为:新生代(Young)和老年代(Old)。 新生代又被划分为三个区域Eden、From Survivor, To Survivor等。无论怎么划分,最终存储的都是实例对象, 进一步划分的目的是为了更好的回收内存, 或者更快的分配内存。

java堆的大小是可扩展的, 通过-Xmx和-Xms控制。

如果堆内存不够分配实例对象, 并且对也无法在扩展时, 将会抛出outOfMemoryError异常。

在大多数32位机、Sun的JVM上,Java的堆空间默认的大小为128MB,但也有例外,例如在32未Solaris操作系统(SPARC平台版本)上,默认的最大堆空间和起始堆空间大小为-Xms=3670K和-Xmx=64M。

对于64位操作系统,一般堆空间大小增加约30%。

但你使用Java1.5的throughput垃圾回收器,默认最大的堆大小为物理内存的四分之一,而起始堆大小为物理内存的十六分之一。

要想知道默认的堆大小的方法,可以用默认的设置参数打开一个程序,使用JConsole(JDK1.5之后都支持)来查看,在VMSummary页面可以看到最大的堆大小。

用这种方法你可以根据你的程序的需要来改变堆内存大小,我强烈建议采用这种方法而不是默认值。

如果你的程序很大,有很多对象需要被创建的话,你可以用-Xmsand-Xmx这两个参数来改变堆内存的大小。

Xms表示起始的堆内存大小,Xmx表示最大的堆内存的大小。

另外有一个参数-Xmn,它表示newgeneration(后面会提到)的大小。

陕西电脑培训http://www.kmbdqn.cn/认为有一件事你需要注意,你不能任意改变堆内存的大小,你只能在启动JVM时设定它。