栈数据结构
一、关于栈数据结构:
* 它是一个 “先进后出的数据结构”
* 栈/stack它还是一种特殊的线性表,表尾为栈顶,表头叫栈底
* 关于栈数据结构,我画了个简单的示意图:
*
* 以下代码用于演示入栈和出栈
/**
*最终输出结果为:
* main方法入栈//最先入栈
* m1方法入栈
* m2方法入栈
* m3方法入栈//最后入栈
* m3方法出栈//最先出栈
* m2方法出栈
* m1方法出栈
* main方法出栈//最后出栈
*/
public class StackTest01
{
//main方法作为程序入口,最先执行,最先入栈
public static void main(String[] args){
System.out.println("main方法入栈");
m1();//调用m1方法,此时程序停在此处,m1方法执行
System.out.println("main方法出栈");
}
//m1方法被调用执行
public static void m1(){
System.out.println("m1方法入栈");
m2();//调用m2方法,此时程序停在此处,m2方法执行
System.out.println("m1方法出栈");
}
//m2方法被调用执行
public static void m2(){
System.out.println("m2方法入栈");
m3();//调用m3方法,此时程序停在此处,m3方法执行
System.out.println("m2方法出栈");
}
//m3方法被调用执行
public static void m3(){
System.out.println("m3方法入栈");
System.out.println("m3方法出栈");
}//m3方法结束
}
java方法的内存分析
一、方法在执行过程中,在jvm中如何分配内存?
- 方法只定义,不调用,是不会执行的,并且JVM中也不会给该方法分配“运行所属”的内存空间
- 在JVM内存划分上有这样三块主要的内存空间(当然,除了这三块之外还有其他的内存空间)
- 方法区内存:最先有数据,方法代码片段属于.class的一部分.class 生成时,将方法代码片段的字节码文件存放在方法区内存
- 栈内存:调用(运行)方法时,在栈内存中给该方法分配栈内存空间,此时发生压栈动作;方法执行结束后,分配的栈内存空间全部释放,发生弹栈动作;局部变量在方法体中声明,局部变量运行阶段内存在栈内存中分配
- 堆内存:主要是为对象分配的内存,方法的内存分析暂不考虑它
- JVM的这三大内存空间可以简易画个图如下:
二、根据一个具体事例分析java方法的内存变化并画图
- 具体程序代码如下
/**
*该程序功能是先求和再对3取模,然后输出余数
*/
public class MethodTest01
{
public static void main(String[] args){
int a = 7;
int b = 9;
int retValue = sum(a,b);
System.out.print("retValue = " + retValue);
}
public static int sum(int i,int j){
int result = i + j;
int num = 3;
int retValue = mod(result,num);
return retValue;
}
public static int mod(int x,int y){
int z = x % y;
return z;
}
}
内存变化图如下: