Java内存当中有这么几个部分:
栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中)。
堆:存放所有new出来的对象
常量池:在堆中分配出来的一块存储区域,(1)存放储显式的String常量和基本类型常量(float、int等)。(2)可以存储不经常改变的东西(public static final)。常量池中的数据可以共享。
分析如下:
String a = "xyz";①
String b = "xyz";②
分析:
①代码执行后在常量池(constant pool)中创建了一个值为xyz的String对象,②执行时,因为常量池中存在"xyz"所以就不再创建新的String对象了。
String c = new String("xyz");①
String d = new String("xyz");②
分析
①Class被加载时,"xyz"被作为常量读入,在常量池里创建了一个共享的值为"xyz"的String对象;然后当调用到new String("xyz")的时候,会在堆里创建这个new String("xyz")对象;②由于常量池中存在"xyz"所以不再创建"xyz",然后创建新的new String("xyz")。
String ss1 = new String("xyz"); //创建二个对象(常量池和堆中),一个引用
String ss2 = new String("xyz"); //创建一个对象(堆中),并且以后每执行一次创建一个对象,一个引用
String s1 = "xyz"; //创建一个对象(常量池中),一个引用
String s2 = "xyz"; //不创建对象(共享上次常量池中的数据),只是创建一个新的引用
祝学习愉快!
|
|