(一):区别java内存中堆和栈:
1.栈:数据可以共享,存放基本数据类型和对象的引用,其中对象存放在堆中,对象的引用存放在栈中; 当在一段代码块定义一个变量时,就在栈中 为这个变量分配内存空间,当该变量退出该作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。
2.堆:存放用new产生的数据,其中清理垃圾采用垃圾回收机制。 在堆中产生了一个数组或对象后,还可以 在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。 数组和对象在没有引用变量指向它的时候,才变为垃圾,不能在被使用,但仍 然占据内存空间不放,在随后的一个不确定的时间被垃圾回收器收走(释放掉)。
3.相关代码:
View Code
package zdbString; public class Test { /* * 这个源文件主要是测试java中string的内存原理、运算符“==”和函数equals()的区别 * 总结:(1)引用str1被放在栈中,字符串常量hello放在常量池中,引用str1指向常量池中的hello;而引用str3被存放在栈中,同时在堆中开辟一块新的内存存放string对象。(2) * 相关连接网址:http://jingyan.baidu.com/article/8275fc869a070346a03cf6f4.html */ public static void main(String[] args) { String str1 = "hello"; String str2 = "hello"; String str3 = new String("hello"); String str4 = new String("hello"); System.out.println("str1==str2==="+(str1==str2));//true System.out.println("str1.equals(str2)==="+(str1.equals(str2)));//true System.out.println("str3==str4==="+(str3==str4));//false System.out.println("str3.equals(str4)==="+(str3.equals(str4)));//true System.out.println("str1==str3==="+(str1==str3));//false System.out.println("str1.equals(str3)==="+(str1.equals(str3)));//true } }
4.相关内存图: