堆内存(heap)和栈内存(stack)区别

栈内存:
    在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 栈内存主要存放的是基本类型类型的数据 如、( int, short, long, byte, float, double, boolean, char) 和对象句柄。并无有String基本类型、在栈内存的数据的大小及生存周期是必须肯定的、其优势是寄存速度快、、栈数据能够共享、缺点是数据固定、不够灵活。

栈的共享:
 
                  String a = "abc";
String b = "abc";
System.out.println(a==b);
      结果为true 这就说明了a b其实指向同一个值
注意,咱们这里并不用a.equals(b);的方式,由于这将比较两个字符串的值是否相等。==号,根据JDK的说明,只有在两个引用都指向了同一个对象时才返回真值。而咱们在这里要看的是,a与b是否都指向了同一个对象。
结果说明,JVM建立了两个引用a和b,但只建立了一个对象,并且两个引用都指向了这个对象。

首先它会在栈中建立一个变量为a的引用,而后查找栈中是否有abc这个值,若是没找到,就将abc存放进来,而后将a指向abc。接着处理String b = "abc";在建立完b的引用变量后,由于在栈中已经有abc这个值,便将b直接指向abc。这样,就出现了a与b同时指向abc
特别注意的是,这种字面值的引用与类对象的引用不一样。假定两个类对象的引用同时指向一个对象,若是一个对象引用变量修改了这个对象的内部状态,那么另外一个对象引用变量也即刻反映出这个变化。相反,经过字面值的引用来修改其值,不会致使另外一个指向此字面值的引用的值也跟着改变的状况。如上例,咱们定义完a与b的值后,再令a=abcd;那么,b不会等于abcd,仍是等于abc。在编译器内部,遇到a= abcd;时,它就会从新搜索栈中是否有abcd的字面值,若是没有,从新开辟地址存放abcd的值;若是已经有了,则直接将a指向这个地址。所以a值的改变不会影响到b的值。
堆内存:
  堆内存用来存放全部new 建立的对象和 数组的数据、

String a = new String ("abc");
String b = "abc";
System.out.println(a==b); //False
String a = new String ("abc");
String b = new String ("abc");
System.out.println(a==b); //False

建立了两个引用。建立了两个对象。两个引用分别指向不一样的两个对象。以上两段代码说明,只要是用new()来新建对象的,都会在堆中建立,并且其字符串是单独存值的,即便与栈中的数据相同,也不会与栈中的数据共享。 数组

原文出自:http://www.douban.com/note/199184450/ 函数

相关文章
相关标签/搜索