想请教各位师兄一个java基础的问题,谢谢您们!
有下面语句:String s1 = new String(“aaa”); // 语句1
String s2 = new String(“aaa”); // 语句2
假如:
语句1中的new String(“aaa”)这个对象的内存情况:常量aaa
0X11String s1声明语句的内存情况:
0X11
s1:0x87
语句2中的new String(“aaa”)这个对象的内存情况:
常量aaa
0X12String s2的内存情况:
0X12
s2:0x88
String s1 = new String(“aaa”);、String s2 = new String(“aaa”);中的2个new,肯定是2个内存地址空间:0X11和0X12,疑问:java中有一个字符串常量池,常量aaa一定会对应一个内存地址空间,假如是:0X66,在这2条语句:String s1 = new String(“aaa”);
String s2 = new String(“aaa”);中,我认为:引用的都是字符串常量:aaa,jvm会共享相同的字符串常量,请问:0X11内存地址空间中存储的是常量aaa,还是一个内存地址0X66?
有下面语句:String s1 = new String(“aaa”); // 语句1
String s2 = new String(“aaa”); // 语句2
假如:
语句1中的new String(“aaa”)这个对象的内存情况:常量aaa
0X11String s1声明语句的内存情况:
0X11
s1:0x87
语句2中的new String(“aaa”)这个对象的内存情况:
常量aaa
0X12String s2的内存情况:
0X12
s2:0x88
String s1 = new String(“aaa”);、String s2 = new String(“aaa”);中的2个new,肯定是2个内存地址空间:0X11和0X12,疑问:java中有一个字符串常量池,常量aaa一定会对应一个内存地址空间,假如是:0X66,在这2条语句:String s1 = new String(“aaa”);
String s2 = new String(“aaa”);中,我认为:引用的都是字符串常量:aaa,jvm会共享相同的字符串常量,请问:0X11内存地址空间中存储的是常量aaa,还是一个内存地址0X66?
String s2 = new String(“aaa”); // 语句2
上面连个对象是在heap中,地址肯定就不一样了。String s3 = "aaa";//在stack
String s4 = "aaa";//所以更上面的是同一个引用
s3,s4是在stack中,他们引用的是一个对象。
即:
String s1 = new String(“aaa”); // 语句1这条语句中 new String(“aaa”); 创建的对象,它的内存地址是:0X11,而现在常量池中已经有aaa了,地址是:0X66,我想问:0X11内存地址空间中存储的是常量池中aaa常量的另一个完全相同的副本值aaa?还是常量aaa的地址0X66?如果存储的是0X66,那就说明所有出现aaa的地方都会用一个常量值的地址0X66。
String s3 = "aaa";//是在栈内存中
他们都不在同一块内存中,所以:
s1和s3没有关系,他们之间的唯一关系就是存储的内容一样都是"aaa".
我觉得应该是存的一个副本 而不是存的引用地址。
java new 一个对象在堆中,如果是引用型的,那就是先在栈中开辟一个空间,然后有了对象,就指向堆中的对象。
如果要说最底层的话,那都是存在内存中,然后地址寄存器指向内存单元。
我自己的理解,不知道正不正确。希望有用而已。
创建对象时,先在String Pool中,看有没有生成“aaa”有没有这个字符串的对象,如果有,则不在String Pool中创建对象,直接在heap中创建对象,然后直接返回给heap中的地址,赋给s1,这样s1就指向了heap中的这个对象。如果没有在String Pool中没有生成这个对象,则先在String Pool中生成对象。
所以,String s2= new String("aaa");直接在heap中生成对象,而String s1 = new String(“aaa”);先在String Pool生成对象,然后在heap中生成对象。
【在常量池中永远只有一份,在堆中有多份】
给楼主上个图,就明白了String s1 = "china";
String s2 = "china";
String s3 = "china";
String ss1 = new String("china");
String ss2 = new String("china");
String ss3 = new String("china");