java内存模型

java的内存模型----我的java成长之路
初学java很懵,它和C语言完全不一样。首先java面向对象(围绕对象来展开),而C语言是面向过程(分步骤来解决问题)。好了回归今天的主题java的内存模型。
在java中存放的容器有堆栈、方法区,其中方法区又包括常量池、静态区、代码区。在栈中存放的是变量名,在堆中存放的是变量的值,常量池中存放的是常量,代码区放的就是代码了。我们来看一个例题:
java内存模型
为什么是这个结果,我们先来看一下它的内存模型:

java内存模型
图中我们可以看到s1、s2、s3是常量,它们的值是存放在常量池中的,它们的名字是存放在栈里;s4、s5它们是对象,它们的值是放在堆中,它们的名字是放在栈中。在常量池中存放了s1(abc)s2(abcdef),等到存放s3时,计算机会发现常量池中有abcdef了,然后s3就直接指向了abcdefde 空间,不会重新开辟一个新空间。因为s4、s5是对象,所以它们的值放在堆中,两个对象会放在不同的空间里,就算他们的值是相同的,它们都有自己的空间。s1和s2是不相等的,它们的值不相等;s2和s3是相等的,它们的值相等且都指向同一片空间;s4、s5是不相等的,比较的时候对象比较的是地址,两个地址是不相同的;s4、s1是不相等的s4传过来的值,s1传过来的是值。如果s5=s4,此时运行的结果是true,因为这里把s4指向的地址传给了s5,所以他们指向的是同一片空间。