本帖最后由 magi1201 于 2014-03-07 12:35:16 编辑

解决方案 »

  1.   

    像这种"a"、"b"直接赋值给别人的,没有经过new的,是被存在String池的,有自己单独的存储空间
    而new出来的是在堆区。
    当String str1 = "a";后,若再有一个String str2 = "a";时,str1 和str2指向是一样的,即str1==str2为真。
    若是String str1 = "a";后有String str2 = new String("a");则str1!=str2
    String str4 = str1 + str2; 和String str5 = "a" + "b";其实都是new出来的,即使值相同地址也会不同
      

  2.   

    解释的不太对吧,str3 == str5 是true . 现在就想知道,str4 和 str5 一个是字符串直接相加,一个是变量名相加,这两者有何不同,还望不吝赐教 
      

  3.   

    我艹String str5 = "a" + "b";不是new的,也是在String池中
      

  4.   

    是不是因为“a”“b”都是静态的不可改变,所以str5就引用了静态区的,由于那两个变量相加,他们说引用的值可能变化,所以str4在动态区
    我猜的
      

  5.   

    ‘==’既比较内容也比较地址,前一个存的是引用,后一个存的是内容,肯定地址不一样了。。如果改为equals那么就是true了,
      

  6.   

    请解释 str4 和 str5 的区别,一个是通过变量名相加,一直通过变量值相加,这个区别在哪里 
      

  7.   

    字面量的字符串会在编译器优化,"a" + "b" 编译期会直接优化成"ab", 前面已经s3 = "ab";所以引用s5的值在编译期就已经确定了指向"ab"; 
    s1 + s2的结果无法在编译期确定(如果你把s1、s2定义为final类型,3个结果都是true了)
      

  8.   

    String s = "ab";
    这句是定义一个String变量s,jvm会先去字符串池中找有没有"ab",有的话就把s指向"ab",没有就会先在池中创建一个,再让s指向"ab"。
    String s = new String("ab");
    这句是先定义一个String变量s,然后在内存中分配新的空间"ab"再让s指向这个内存地址。
      

  9.   

    这是因为String4需要新的内存空间吧~指向的对象不同的缘故吧~
      

  10.   

     回答不在点上,讲讲 str4 和 str5 的区别,两个都是相加,他们的相加有什么区别呢。
      

  11.   

    为什么str5 不需要新的内存空间呢
      

  12.   

    大牛啊,编译器优化,真的不知,至于str1+str2这样的句子会new一个String对象?不了解~盼大牛回复~
      

  13.   

    String str4 = str1 + str2;
    String str5 = "a" + "b";
    一个是常量赋值,一个是变量赋值。
    java 在编译的时候就知道"a"+"b"="ab" 了。在运行时才知道str1+str2 = "ab"
      

  14.   

    这种问题基本上是 Thinking in Java 看多了的才会去纠结
      

  15.   

    火龙果前辈好 
     最近开始看java虚拟机相关的东西,就正好碰到这个问题 
      

  16.   

    对的,
    我觉得楼主还是去看语言规范吧(The Java™ Language Specification Third Edition),在 3.10.5节(我的是第三版),解释了 字符串字面量对于编辑期间和运行时的处理,另外,貌似这些是 java规定的有时不用太过纠结,因为这个只是规范,不不是所有的 VM实现都一样的,那时 jvm的事.
      

  17.   

    对的,
    我觉得楼主还是去看语言规范吧(The Java™ Language Specification Third Edition),在 3.10.5节(我的是第三版),解释了 字符串字面量对于编辑期间和运行时的处理,另外,貌似这些是 java规定的有时不用太过纠结,因为这个只是规范,不不是所有的 VM实现都一样的,那时 jvm的事. 嘿嘿 谢谢推荐 回头去书店看看你讲的那本书 现在看的是JVM处理的一些事情 
      

  18.   

    大牛啊,编译器优化,真的不知,至于str1+str2这样的句子会new一个String对象?不了解~盼大牛回复~
    这不是什么高深的东西,书上都有写。s1 + s2这里面设计到加号运算符重载,也是java里唯一的运算符重载。
    对于String z = x + y; 具体实现大致是这样
    StringBuilder temp = new StringBuilder();
    temp.append(x);
    temp.append(y);
    String z = temp.toString();
    你可以断点到StringBuilder类里,看它的toString实现就明白了
      

  19.   

    a+b =ab  首先 回去池里面找 ab 如果没有就会new 而str3 那已经把 ab创建了
    所以str4 会直接指向  而不会new
      

  20.   

    为什么str5 不需要新的内存空间呢
    因为a和b都是常量,a+b和ab都是在常量池的,str5并不需要新的内存空间就可以得到ab了。而str4先得开辟空间才行。
      

  21.   

    楼主,str1 = "a"和“a”是不一样的,只是值一样,但是位置是不同的
      

  22.   

    你说的String str1 = "a" 和 “a" 不同,第二个”a" 是 ?
      

  23.   

    你说的String str1 = "a" 和 “a" 不同,第二个”a" 是 ?
    str1=“a” 这个str1是new出来的,值是"a" ,但是和被赋值的“a”是不相同的,只是值复制了,指向是不同的,“=”是要二个完全一样的才是true