string str="abc"
在java中,单独这句最多创建一个对象,那么这个对象到底存在在内存的什么地方呢,是存在椎中还是栈中呢?
有一种比较多的说法是"abc"对象创建在string池中,那么请问一下这个String池是存储在椎中还是栈中呢?还有,string str2 = new String("abc")一般创建两个对象,那这两个对象又存储在内存的什么对方?
在java中,单独这句最多创建一个对象,那么这个对象到底存在在内存的什么地方呢,是存在椎中还是栈中呢?
有一种比较多的说法是"abc"对象创建在string池中,那么请问一下这个String池是存储在椎中还是栈中呢?还有,string str2 = new String("abc")一般创建两个对象,那这两个对象又存储在内存的什么对方?
字符串常量池即不在栈也不在椎
http://topic.csdn.net/u/20080509/09/909142fc-6eb0-4886-94e5-0d6448c1a1c5.html?437417952
好好的看一下吧,总结的很好
string是存放在string池里,但string池究竟是存入在堆中还是栈中的呢?
按照5楼的解放,这常量又是存入在常量池中,所以常量池应该是在栈中吧,因此String池也就在栈中了,请大家帮忙看看是这样的解释对吗?
String s2 = new String("s1") ;
上面创建了几个String对象?
答案:3个 ,编译期Constant Pool中创建1个,运行期heap中创建2个.
string str2 = new String("abc")
创建了2个对象,编译期Constant Pool中创建1个,运行期heap中创建一个pool中只要有相同值的只创建一次。heap中有相同值的,在heap中都开辟内存空间,后面开辟的是指向第一个开辟的引用(即指针)另外,基本数据类型是存在stack中,对象类型是存在heap中
jvm把字符串常量和其他基本类型字面常量放入常量池里面是出于自己对性能的考虑,这不是使用java编程的时候需要考虑的。或者说程序员不应该对这种机制有依赖。
不过它怎么存的,知道比较字符串内容的时候使用equals()方法而不要用==就可以了,别的根本没什么意义。
再有就是不要用new来创建字符串即可。
比如 Boolean a=new Boolean(true);
Boolean b=new Boolean(true);
他的这个存储方式也是和String方式一个意思,使得 a==b为真;
还是因为 Boolean的equals方法的原因;
String是jvm的一个处理机制。
而Boolean,Short,Byte里面用的是静态缓存机制,可以理解为享元模式的体现.
Boolean a=new Boolean(true);
Boolean b=new Boolean(true);
这样得到的a,b不是一样的.建议使用Boolean valueOf(true);这样得到的是同一个对象.
String s1 = "abc";
String s2 = "abc";
String s3 = new String("abcd");
System.out.println(s1.hashCode() + "," + s2.hashCode() + "," + s3.hashCode());
第二个问题:string str2 = new String("abc")
如果对象池中没有"abc"这个字符串,则首先在字符串池中创建一个对象,然后再在堆中创建一个对象,其值也是“abc”,并创建一个引用指向这个对象。
所以说,一般创建两个对象。但也有另外一种情况,就是所谓的特殊:如果在string str2 = new String("abc")这句前面已经执行了一句String str = "abc" 或String aa = new String("abc") ; 或其他类似的使字符串池中已经有了"abc"时,string str2 = new String("abc")这句只创建一个
对象,即在堆中创建的那个。
不能说创建了几个对象,这需要看你怎么理解对象的含义。说创建一个对象的,他只说new的算对象,其他的不算。说创建2个的,也没错,他把万事万物都看做对象了,他把引用和new出来的都看成了对象。
你要明白heap就是一个特殊的stack。引用,局部变量,参数(形),return返回的,他们都放在栈中,new出来的放在heap中。
stack中的引用保存的是heap中对象的地址,也就是引用指向heap内存楼主可以加分了
----------
前边大哥的贴里(http://topic.csdn.net/u/20080929/02/4e0ef626-98ee-4d6d-96ed-fe40afe8290b.html)
有一句这个