为什么 String str = new String("ABC"); 会创建2个对象?
请详细解答内存过程, 谢谢~!

解决方案 »

  1.   

    此回复为自动发出,仅用于显示而已,并无任何其他特殊作用
    楼主【ABC123CBA321】截止到2008-07-16 11:56:59的历史汇总数据(不包括此帖):
    发帖的总数量:26                       发帖的总分数:535                      每贴平均分数:20                       
    回帖的总数量:26                       得分贴总数量:2                        回帖的得分率:7%                       
    结贴的总数量:19                       结贴的总分数:480                      
    无满意结贴数:0                        无满意结贴分:0                        
    未结的帖子数:7                        未结的总分数:55                       
    结贴的百分比:73.08 %               结分的百分比:89.72 %                  
    无满意结贴率:0.00  %               无满意结分率:0.00  %                  
    楼主加油
      

  2.   

    先在STRING POOL中创建ABC   然后在HEAP中创建 NEW STRING("")
      

  3.   

    一个在栈内存中,new 的那个在堆内存中
      

  4.   

    看看这个例子就明白了:public class Test{
        public static void main(String[] args) {
            String str=new String("ABC");
        }
    }它的虚拟机指令集:Compiled from "Test.java"
    public class Test extends java.lang.Object{
    public Test();
      Code:
       0: aload_0
       1: invokespecial #1; //Method java/lang/Object."<init>":()V
       4: returnpublic static void main(java.lang.String[]);
      Code:
       0: new #2; //class java/lang/String
       3: dup
       4: ldc #3; //String ABC
       6: invokespecial #4; //Method java/lang/String."<init>":(Ljava/lang/String;)V
       9: astore_1
       10: return}
    看看main方法里的操作,
    new String()//这是 你要创建的对象
    ldc #3;//String ABC 这是池中的对象
      

  5.   

    同意楼上的。别人关于这个问题的答复,
    java里面的对象都是放在heap中,引用是可以放到stack中的,String  str=new  String("ABC");在编绎时会把"ABC"作为常量放到类的常量池中,运行时调用new指令时会再在堆中产生一个String类型的对象,把常量池中的"ABC"的值复制过来,然后让str指向堆中的String对象,所以应该是两个对象,一个是String类的Class对象中的常量字符串对象,一个是new出来的堆中的字符串… 
      

  6.   

    如果代码是这样的话String str=new String("ABC")就创建一次了,呵呵,刚刚学到的public class Test{
        public static void main(String[] args) {
            String a = "ABC";
            String str=new String("ABC");
        }
    }