JAVA 堆栈 关于String那些事

JAVA 中变量分为 1. 基本类型 2.引用类型    基本类型都是值传递, 其他的都是引用传递

                              基本类型有: byte, long, short, int, double, float, boolean, char

JAVA 的堆栈

Java的内存机制分为堆内存,栈内存,方法区等。

两者差别:

堆内存主要存放实体对象,用来存放new的对象和数组引用变量的实体对象。由虚拟机自动垃圾回收器管理。

栈内存主要存放基本基本类型的变量。

方法区主要存放一个类的模板和静态方法。

声明位置的不同决定储存位置

在方法中声明(局部变量):调用方式时在栈中分配空间给变量,结束时释放栈,体现变量的局限性。

在类中声明(成员变量):由于作用周期需要,变量存放在堆中。不会因方法销毁为失效,类似于C中的全局变量。

对于引用变量来说,对应内存所储存的值是一个引用,是对象的储存地址,被存放在栈中

堆主要用来存放对象 , 栈用来存放基本类型跟引用, 用来执行程序。 

Stack栈: 储存基本数据类型的变量,对象的引用。 栈的存取速度更快,大小和生存期必须是确定的, 因此缺乏一定灵活性。

Heap堆 ,常量池: 引用类型的变量, (new 创建的对象都在堆内存) 线程之间会共享堆内存,可以在运行时动态分配内存

JAVA引用的用法: 在堆中产生了一个数组或对象后,可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象 在队中的首地址, 栈中的这个变量就成了这个数组/对象的引用变量。 就相当于为数组/对象 起的一个名字。

例:

String s = "abc" ; // 把“abc"放到常量区中,在编译时产生
String s = "ab" + "c"; 把”ab" + "c" 转换为字符串常量“abc" 并放到常量区中
String s =  new String("abc") 在运行时 把“abc" 放到 堆里

String s1 = "abc"; 在栈里创建s1 并指向常量区中的”abc"
String s2 = new String("abc");  在堆中又创建一个新的对象
    

猜你喜欢

转载自blog.csdn.net/DamonUp/article/details/88304467