解决方案 »

  1.   

    System.out.println(s3==("你"+"好吗"));
                                               //这个是true
    String对象会维护一个对象池!如果像String s3 = "你好吗";这样赋值就会先从对象池中找!如果找到就直接返回引用!所以第一个
    是true!
    第二个我也不大懂可能就像你老师说的那样吧!但是s4+s5和s3的hash值是相同的啊?迷茫啊!
      

  2.   


    System.out.println(s3==("你"+"好吗")); 这个java变为字节码直接优化了s3=="你好吗";  常量字符串都是相等的。所以返回为true。System.out.println(s4+s5==s3); s4+s5没有优化,使用StringBuilder进行+运算,返回的是一个New String()对象。所以不等。
      

  3.   

    像是     "你"+"好吗"    在编译阶段就已经确定了,它是不可变的(字符串是不可变类,从创建到销毁始终保持不变)。而s4+s5是不确定的,因为s4和s5可以改变指向。老师说的是对的
      

  4.   

    s3 == "你"+"好吗"为true是因为在字符串池中找到了"你好吗"这个字符串
    字符串对象相加会生成新的字符串对象,而不是查找字符串池,所以对象的引用不同,结果为false
    package csdn;public class test {
    public static void main(String[] args) {
    String str1 = "你好吗";
    String str2 = "你好" + "吗";
    String str3 = new String(str1);
    String str4 = str1 + "";
    System.out.println(str1 == str2);
    System.out.println(str1 == str3);
    System.out.println(str1 == str4);
    } public static void print() {
    System.out.println("call print()");
    }
    }
      

  5.   

    第二个因为String变量相加要新开辟一段内存来使用StringBuilder来实现,所以分配在堆上,而s3在栈上,所以肯定false啊
    而且,即使hashcode一样,两个string也不一定等("buzzards" 和 "righto" )
      

  6.   

          1.设s45=s4+s5局部变量s4,s5存储的是堆中两个拘留字符串对象的地址。而当执行s4+s5时,JVM首先会在堆中创建一个StringBuilder类(继承AbstractStringBuilder,底层是用char数组装字符的),同时用s4指向的拘留字符串对象完成初始化,然后调用append方法完成对s5所指向的拘留字符串的合并操作,接着调用StringBuilder的toString()方法在堆中创建一个String对象,最后将刚生成的String对象的堆地址存放在局部变量s45中。而局部变量s3存储的是常量池中"你好吗"所对应的拘留字符串对象的地址。 s45与s地址当然不一样了。
          2."你"+"好吗"会直接在编译期就合并成常量"你好吗", 因此相同字面值常量"你好吗"所对应的是同一个拘留字符串对象,自然地址也就相同。
      

  7.   

    老师说的是对的
    如果你给s4 , s5 前面加上final 修饰的话
    final String s4 ="你";
    final String s5 ="好吗";
    那么 s4 和 s5  就相当于是常量了,就不会再变
    那么 s4+s5 在编译期就完成了,第二个等式 就true了