更多了解:https://blog.csdn.net/zhangbaoanhadoop/article/details/82193497
栈的特点如下
1.栈描述的是方法执行的内存模型。每个方法被调用都会创建一个栈帧(存储局部变量,引用变量(方法中声明的对象的引用)、操作数、方法出口等)
2.JVM为每个线程创建一个栈,用于存放该线程执行方法的信息(实际参数、局部变量等)
3.栈属于线程私有,不能实现线程间的共享!
4.栈的存储特性是”先进后出,后进先出"(比如线程调用一个方法a,在栈用开辟一块空间存放线程a的所有的变量,方法a中调用方法b,在开辟一块空间存放方法b的所有的变量),如图所示,当方法b执行完毕,存放方法b中栈帧销毁,等方法b执行完毕,方法a执行完毕,方法a的栈帧销毁(体现出了先进后出)
5.栈是由系统自动分配,速度快!栈是一个连续的内存空间。
堆的特点如下
1.堆用于存储创建好的对象和数组(数组也是对象)
2.JVM只有一个堆,被所有线程共享(堆中的对象不一定被所有的线程共享)
3.堆是一个不连续的内存空间,分配灵活,速度慢!
方法区(又叫静态区)特点如下
1.JVM只有一个方法区,被所有线程共享!
2.方法区实际也是堆,只是用于存储类、常量相关的信息!
3.用来存放程序中永远是不变或唯一的内容。(类信息【Class对象】、静态变量、字符串常量等)
java值传递
对于基本数据类型传递就是值的内容
对于引用类型,传递的是内存地址
public class Demo { public static void main(String[] args){ int a = 1; new Demo().test(a); System.out.println(a); String str = "str"; new Demo().test1(str); System.out.println(str); ArrayList<Integer> integers = new ArrayList<>(); new Demo().test2(integers); System.out.println(integers); ArrayList<Integer> integers1 = new ArrayList<>(); new Demo().test3(integers1); System.out.println(integers1); } public void test(int a){ a++; } public void test1(String str){ str = "str"+str; } public void test2(List<Integer> list){ list.add(1); } public void test3(List<Integer> list){ ArrayList<Integer> integers = new ArrayList<>(); integers.add(2); list = integers; } }
传递值是str类型,原因在于string是不可以变的,如果对它进行修改,就会重新创建一个对象