http://blog.csdn.net/xyz1982510/archive/2008/09/12/2916467.aspx
看过上面详细的解释贴,但还是有疑问。在此请求解答。文中说:
String是一个特殊的包装类数据。可以用: 
String str = new String("abc"); 
String str = "abc"; 
两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。 
而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。 
问题一:String str1 = "abc"; 
String str2 = "abc"; 
System.out.println(str1==str2); //true问题二:String str1 =new String ("abc"); 
String str2 =new String ("abc"); 
System.out.println(str1==str2); // false问题三:String s1 = "ja";
String s2 = "va";
String s3 = "java";
String s4 = s1 + s2;
System.out.println(s3 == s4);//false
System.out.println(s3.equals(s4));//true根据上面解说,能理解问题一和问题二。
但是关于问题一还有一个疑问:这个str1和str2是不是在栈里,"abc"只有一个,在堆里。str1跟str2的值都是"abc"的起始地址,是否是这样?
关于问题三,计算s4=s1+s2的时候 栈和堆是怎么分配的,谢谢!!!!!

解决方案 »

  1.   

    http://hi.baidu.com/%B3%CC%D0%F2%D4%B1%C4%BF%B1%EA/blog/item/21da28447c76fa056b63e5ed.html自己看吧,说的很清晰了
      

  2.   


    s1-s3都在栈内,各自的值是对应字符串在栈内的地址?可以这样理解么?那么在分配S4的时候是怎么操作的,求解!
      

  3.   

    s1-s3都在栈内,各自的值是对应字符串在栈内的地址,这句是对的s4是2个对象相加,对象的值是在堆里的,那个连接里有说的。。仔细看看
      

  4.   


    朋友,更糊涂了。
    比如:String str = "abc";  之前看到的理解:栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。  
    而你给我资料:这种类型的声明我们都可以理解为他们的内存地址就是相应的值,即把他们当成基本数据类型来理解。
    这两个是否一样?我觉得我已经进死胡同了。
    按我的理解是,即使是基本数据类型,比如int a=1
    的意思是,栈内有2个地址,一个地址比如0x0001,另一个0x0010,一个存放a,一个存放1, 前者指向后者。
    同理对于String str = "abc" 两个地址0x1001,0x1011,分别存放str和abc,前者指向后者。
    这样理解是错的么? 我纠结了。 请帮忙解答
      

  5.   

    。java有个字符串池,在栈里
    String str = "abc";是放在池里的String str =new String("abc");这个"abc"是放在堆里的为什么String a="abc";
    String b = "a"+"b"+"c";
    为什么a==b为true?因为编译器在编译时自动将"a"+"b"+"c"优化为"abc"所以ab的引用时一样的String s1 = "ja";
    String s2 = "va";
    String s3 = "java";
    String s4 = s1 + s2;
    System.out.println(s3 == s4);//false为什么这个不等?因为s4是2个字符串对象的相加,会在堆里开辟内存,所以引用不一样