直接上代码,求解释,俩比较运算结果为何不一样
String s1 = "Hello";
String s2 = "Hello";
System.out.println(s1 == s2);  // 输出: true
String s3 = new String("Hello");
String s4 = new String("Hello");
System.out.println(s3 == s4);  // 输出: false

解决方案 »

  1.   

    查看String的doc文档,里面有答案
      

  2.   

    "Hello"存在栈里,new String("Hello")堆里生成字符串对象其值指向栈中的"Hello"
      

  3.   

    intern
    public String intern()返回字符串对象的规范化表示形式。 
    一个初始为空的字符串池,它由类 String 私有地维护。 当调用 intern 方法时,如果池已经包含一个等于此 String 对象的字符串(用 equals(Object) 方法确定),则返回池中的字符串。否则,将此 String 对象添加到池中,并返回此 String 对象的引用。 它遵循以下规则:对于任意两个字符串 s 和 t,当且仅当 s.equals(t) 为 true 时,s.intern() == t.intern() 才为 true。 所有字面值字符串和字符串赋值常量表达式都使用 intern 方法进行操作。字符串字面值在 Java Language Specification 的 §3.10.5 定义。 
    返回:
    一个字符串,内容与此字符串相同,但一定取自具有唯一字符串的池。
      

  4.   

    String s1 = "Hello";
    String s2 = "Hello";
    s1 s2指向的是一个"Hello",在常量池中,相同串只存在一个
    String s3 = new String("Hello");
    String s4 = new String("Hello");
    创建的是2个对象,对象的地址不同
      

  5.   

    看看String的intern方法就明白s1==s2为true了。我上面贴出来了API中该方法的说明!
    s3和s4是两个对象的引用,所以s3==s4为false。
      

  6.   

    String s1 = "Hello";
    String s2 = "Hello";
    System.out.println(s1==s2);  // 输出: true
    String s3 = new String("Hello");
    String s4 = new String("Hello");
    System.out.println(s3.equals(s4));  // 输出:true
    这样就都是true咯