String 类型定义的,是不可变的,一旦被创建,就不能修改它的值。你去看看String 与StringBuffer的区别你就知道了。

解决方案 »

  1.   

    ==比较的是对象的地址,而不是内容
    此处用s2.equals(s3)
      

  2.   

    简而言之,s2 和 s3 是两个内容相同的字符串,而不是同一个字符串,所以用 == 比较结果是 false 
     == 比的是两边是否为同一个对象,equals() 才是比较内容
      

  3.   

    String s1 ="a"+"b";
    String s2 ="a"+"b";
    s1==s2;
    结果为true.为啥这个是true,上面那个是false
      

  4.   

    s2,s3不是同一字符串,为啥s1 s2是同一字符串?
      

  5.   


    这么写的话,定义s1的时候,"ab" 这个字符串放在了内存的常量区
    定义s2的时候,会先检查常量区是否有同样的"ab",找到了就直接指向它,而不用再次生成一个"ab"这种情况用 == 比较,虽然结果是对的,但不建议这样写,因为本意不是这样的
      

  6.   

    照这样说,第一种情况s2 s3 应该也是一样的为啥显示false呢
      

  7.   


    区别在于
    String s2 ="a"+"b";这句看似是运算,但因为都是常量,编译器直接就改成String s2 = "ab" 了
    而String s2 = s1 + "b";这句,是真正的运算,编译期间是没法知道运算结果的,所以不会自动做处理
      

  8.   

    虽然不会自动处理,但是你可以用 s2.intern() 这个方法,强制放到常量区里,然后就跟String s2 ="a"+"b";一样了
      

  9.   

    懂了一点了,但是,s2引用指向的是s1+"b"的结果 就是"ab",在字符区。
    s3创建的时候如果先检查字符区是否有"ab"的话,那按说把s2的地址给s3了,s2还是等于s3啊
      

  10.   


    你可以看下这篇东西
    http://1023mmmm.blog.163.com/blog/static/3884022520121022149911/
      

  11.   

    “a”+"b"和“ab”的确是指向同一个地址的。但是在s3创建的时候是不知道s1的值的。只能开辟新的内存空间用于保存s3的内存地址。