Java中String内存分析
一句话概括:
基本类型的变量数据和对象的引用都是放在栈里面的,对象本身放在堆里面,显式的String常量放在常量池,String对象放在堆中。
常量池说明:
它是为了方便快捷地创建某些对象而出现的,当需要一个对象时,就可以从池中取一个出来(如果池中没有则创建一个),则在需要重复重复创建相等变量时节省了很多时间。常量池之前是放在方法区里面的,也就是在永久代里面的,从JDK7开始移到了堆里面。
代码分析:
String explicitS1 = "abc";
// 执行后就在常量池中创建了一个值为abc的String对象并将栈中的引用指向常量池中的对象
String explicitS2 = "abc";
// 常量池中存在值为abc的String对象了,直接将栈中的引用指向常量池中的对象
String objectS1 = new String("ABC");
// Class被加载时就在常量池中创建了一个值为ABC的String对象,执行时会在堆里创建new String("ABC")对象并将栈中的引用指向堆中的对象
String objectS2 = new String("ABC");
// 常量池中存在值为ABC的对象,直接在堆里创建new String("ABC")对象并将栈中的引用指向堆中的对象