String s1 = new String(“aaa”);语句创建的对象new String("aaa")中存储的是地址还是字符串常量值?
想请教各位师兄一个java基础的问题,谢谢您们!有下面语句:
String s1 = new String(“aaa”); // 语句1
String s2 = new String(“aaa”); // 语句2
假如:
语句1中的new String(“aaa”)这个对象的内存情况:
常量aaa
0X11
String s1声明语句的内存情况:
0X11
s1:0x87
语句2中的new String(“aaa”)这个对象的内存情况:
常量aaa
0X12
String 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
上面连个对象是在heap中,地址肯定就不一样了。
String s3 = "aaa";//在stack
String s4 = "aaa";//所以更上面的是同一个引用
s3,s4是在stack中,他们引用的是一个对象。
--------------------编程问答-------------------- 常量池 是在 stack中。 --------------------编程问答-------------------- new是在堆中重新分配的,所以每次都是不一样的。
而常量声明,系统为了节省资源,会优化成使用相同的常量。
但,这只是编译器的优化,你不要依赖这个特性。 --------------------编程问答--------------------
1楼是对的 --------------------编程问答-------------------- 师兄,非常感谢您们的关注和回复!!!
但我想问的问题还是没有明白,期望师兄们指点,谢谢您们师兄
请问:0X11内存地址空间中存储的是常量aaa,还是一个内存地址0X66?
即:
String s1 = new String(“aaa”); // 语句1
这条语句中 new String(“aaa”); 创建的对象,它的内存地址是:0X11,而现在常量池中已经有aaa了,地址是:0X66,我想问:0X11内存地址空间中存储的是常量池中aaa常量的另一个完全相同的副本值aaa?
还是常量aaa的地址0X66?如果存储的是0X66,那就说明所有出现aaa的地方都会用一个常量值的地址0X66。
--------------------编程问答-------------------- new出来的东西在堆内存中,,字符串常量在data segment中 --------------------编程问答--------------------
String s1 = new String(“aaa”); // 语句1 是在堆内存中
String s3 = "aaa";//是在栈内存中
他们都不在同一块内存中,所以:
s1和s3没有关系,他们之间的唯一关系就是存储的内容一样都是"aaa".
--------------------编程问答--------------------
LZ的意思是想问new创建的对象里面是存的一个指向常量池里面的常量的引用还是存的一个常量的副本吧
我觉得应该是存的一个副本 而不是存的引用地址。 --------------------编程问答-------------------- http://bbs.csdn.net/topics/390085548 --------------------编程问答-------------------- 首先,我觉得没必要究这么底层的东西,感觉没有很大意思。
java new 一个对象在堆中,如果是引用型的,那就是先在栈中开辟一个空间,然后有了对象,就指向堆中的对象。
如果要说最底层的话,那都是存在内存中,然后地址寄存器指向内存单元。
我自己的理解,不知道正不正确。希望有用而已。 --------------------编程问答-------------------- String s1 = new String(“aaa”)
创建对象时,先在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中生成对象。
--------------------编程问答-------------------- to #8楼的师兄:
是的,我就是想问这个问题! --------------------编程问答--------------------
现在很多人只会盲目用Java,却不知道原因,所谓的“没有意义”,我觉得有兴趣的人可以看JVM··· --------------------编程问答-------------------- 11楼,解释得差不多。
【在常量池中永远只有一份,在堆中有多份】
给楼主上个图,就明白了
String s1 = "china";
String s2 = "china";
String s3 = "china";
String ss1 = new String("china");
String ss2 = new String("china");
String ss3 = new String("china");
--------------------编程问答-------------------- 楼主看看这篇文章,应该会有答案。http://blog.csdn.net/zhangerqing/article/details/8093919 --------------------编程问答-------------------- 看看这个:http://blog.csdn.net/chenshuang_com/article/details/7743296 --------------------编程问答-------------------- 两个语句new在堆内存中创建了两个内存地址 s1,s2 分别被存储到栈内存中,s1指向第一个“aaa” s2指向第二个“aaa”
补充:Java , Java SE