Java的栈(Stack)是一种用于存储程序执行期间方法的运行时数据的数据结构。栈的特点是后进先出(LIFO)的顺序。换言之,新的元素添加到栈的顶端,元素的移除也是从顶端开始的。
Java的栈是执行线程私有的,每个线程都有自己的栈。当一个线程启动时,它的空间大小在创建时就已经确定了。如果Java栈中请求的空间超过了当前可用的空间大小,就会抛出StackOverflowError异常。
public class MyStack { public static void main(String[] args) { int a = 1; int b = 2; int sum = a + b; System.out.println(sum); } }
Java的本地方法栈(Native Method Stack)是与Java栈类似,但是它是为执行本地(非Java)代码服务的。即使用Java语言与实现语言(如C / C ++)交互所需的栈空间。
Java虚拟机规范并没有规定本地方法栈的具体实现方式,因此它可能与Java栈实现方式不同。在大多数情况下,本地方法栈也是与线程关联,在栈空间不足时,会抛出StackOverflowError异常。
public class NativeDemo { public native void sayHello(); static { System.loadLibrary("NativeDemo"); } public static void main(String[] args) { new NativeDemo().sayHello(); } }
以上代码创建了一个本地方法,在Java方法中调用。在调用时,会先在栈顶创建一个适当的栈帧,并将参数传递给本地方法,然后将结果传回Java方法。