下面是我的理解:请人帮我看看是否正确。顺序执行下面的 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

解决方案 »

  1.   

    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对象。 
    报错 变量名已存在
      

  2.   

    除非是常量字串,则 new 对像的话,栈中存的是引用,实体在堆中,而非在栈中。
      

  3.   

    ”abc“存在常量池中,
    需要创建内容为"abc"的对象,只需从常量沲中复制过来就可以了
      

  4.   

    这个建议大家装个JVM的classFile Viewer,直接看codebytes。
      

  5.   

    看看这个,说不定能学到点什么。
    http://blog.csdn.net/ZangXT/archive/2009/08/05/4410246.aspx
      

  6.   

    2、String str = new String("abc"); 
    2个对象
      

  7.   

     类似的问题真多,CSDN要是整理下常见问题的FAQ就好了
      

  8.   

    1.字符串常量是放在常量池里面的.不是在栈创建对象.
    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字符串,如果没有将添加一个一模一样的字符串.