https://blog.csdn.net/u010843421/article/details/78017080
https://www.cnblogs.com/holten/p/5782596.html
栈:存放“基本数据类型”和“对象的引用”
堆:句柄池 + 实例池【存放用new产生的数据--对象实例】
方法区中的常量池:存放在对象中用static定义的静态成员+对象类型数据 ---- String 就存放在这里
String内存位置说明
1、显式的String常量 (常量池有一份,引用指向常量池)
String a = "holten";
String b = "holten";
- 第一句代码执行后就在常量池中创建了一个值为holten的String对象;
- 第二句执行时,因为常量池中存在holten所以就不再创建新的String对象了。
- 此时该字符串的引用在虚拟机栈里
2、String对象 (常量池一份,堆中两份,引用指向堆)
String a = new String("holtenObj");
String b = new String("holtenObj");
- Class被加载时就在常量池中创建了一个值为holtenObj的String对象,
- 第一句执行时会在堆里创建new String("holtenObj")对象;
- 第二句执行时,因为常量池中存在holtenObj所以就不再创建新的String对象了,直接在堆里创建new String("holtenObj")对象。
验证一下
/**
* Created by holten.gao on 2016/8/16.
*/
public class Main {
public static void main(String[] args){
String str1 = "高小天";
String str2 = "高小天";
System.out.println(str1==str2);//true
String str3 = new String("高大天");
String str4 = new String("高大天");
System.out.println(str3==str4);//false
}
}
返回结果:
true
false