下面是我的理解:请人帮我看看是否正确。顺序执行下面的 1 2 3 1、String str = "csdn"; //直接在栈中创建一个csdn对象,性能最佳,类似 int n = 3; 2、String str = new String("abc"); //在堆中创建一个abc对象,同时在栈中放入一个abc对象,但是最终str指向的是堆中的abc对象。最终创建两个对象。3、String str = new String("abc"); str = str.intern(); //前面半句:在堆中创建一个abc对象(此时堆中有两个对象,一个是执行2的时候创建的),此时栈中已经有abc对象了(2中创建的),所以最终创建了一个对象。 后面半句:使str指向栈中的abc对象。我想问一下我这样的理解有没错。如果有错的话请人帮忙说一下,如果没错的话,我有个疑问:栈中只能存放 int lang 八种基本数据类型,为什么还能存放对象。 还有常量池是不是就是指栈中的abc
栈中不能创建对象 最多在常量池创建对象 也有可能不创建
2、String str = new String("abc"); //在堆中创建一个abc对象,同时在栈中放入一个abc对象,但是最终str指向的是堆中的abc对象。最终创建两个对象。
必然在堆中创建一个对象 在栈中产生指向它的引用 栈中不能创建对象 最终也只创建一个对象
3、String str = new String("abc"); str = str.intern(); //前面半句:在堆中创建一个abc对象(此时堆中有两个对象,一个是执行2的时候创建的),此时栈中已经有abc对象了(2中创建的),所以最终创建了一个对象。 后面半句:使str指向栈中的abc对象。
报错 变量名已存在
需要创建内容为"abc"的对象,只需从常量沲中复制过来就可以了
http://blog.csdn.net/ZangXT/archive/2009/08/05/4410246.aspx
2个对象
2.通过NEW关键字创建的对象,他的实体是放在堆里面的.而指向这个对象实体的引用才是放在栈里面的,
String str = new String("abc"); "abc"被放在堆里面,str放在栈里面.
3.首先前部分和第二个问题相同,后部分:str = str.intern(); 这个intern()方法的作用如下:
String str1="abc";
String str2=new String("abc");
System.out.println(str1==str2);
比较结果是false,为什么呢?
因为在str1是在常量池里面,而str2却不是.所在在比较的时候str1在常量池里面找不到str2的引用,所以结果为false.
在看看下面:
String str1="abc";
String str2=new String("abc");
str2=str2.intern();
System.out.println(str1==str2);
这个时候就是输出true了,因为String.intern();这个方法的作用是判读str2在常量池里面有没有和str1一样的unicode字符串,如果没有将添加一个一模一样的字符串.