Java中的值类型和引用类型,以及字符串池
-
堆
-
存储的是对象,每个对象都包含一个与之对应的class
-
JVM只有一个堆区(heap)被所有线程共享,堆中不存放基本类型和对象引用,只存放对象本身
-
对象的由垃圾回收器负责回收,因此大小和生命周期不需要确定
-
-
栈
-
每个线程包含一个栈区,栈中只保存基础数据类型的对象和自定义对象的引用(不是对象)
-
每个栈中的数据(原始类型和对象引用)都是私有的
-
栈分为3个部分:基本类型变量区、执行环境上下文、操作指令区(存放操作指令)
-
数据大小和生命周期是可以确定的,当没有引用指向数据时,这个数据就会自动消失
-
-
方法区
-
静态区,跟堆一样,被所有的线程共享
-
方法区中包含的都是在整个程序中永远唯一的元素,如class,static变量
-
值类型,比如int a=1,b=2;存储在栈里。
引用类型,比如A a=new A(1);会在堆中创建一个对象,然后对该对象的引用(也就是对象在堆中的地址)存储在栈中
字符串String其实也是引用类型,但是String a="12",b="23";a=b;a="qwe";这种操作不会改变b的值。
这里涉及到字符串池的概念,在此引用大佬的讲解https://segmentfault.com/a/1190000009888357?utm_source=tag-newest