public class Test {
private static String s = "string";//(1)
public static void main(String a[])
{
  String t="strin"+"g";
  print(s==t);
}
public static void print(Object o) {
System.out.println(o.toString());
}
}
运行结果是:true
如果把(1)语句改成"private static String s = new String("string");",则运行结果是:false这是什么原因?
是不是跟常量池相关,不明白,请大家解释,谢谢!

解决方案 »

  1.   

    Java运行环境有一个字符串池,由String类维护。执行语句String s="abc"时,首先查看字符串池中是否存在字符串"abc",如果存在则直接将"abc"赋给s,如果不存在则先在字符串池中新建一个字符串 "abc",然后再将其赋给s。 
    执行语句String s=new String("abc")时,不管字符串池中是否存在字 符串"abc",直接新建一个字符串"abc"(注意:新建的字符串"abc"不是在字符串池中),然后将其付给s。 前一语句的效率高,后一语句的效率低,因为新建字符串占用内存空间。
      

  2.   


    也不全和字符串常量池有关。private static String s = new String("string");//s创建了两个对象,一个字符串,一个引用对象。
    String t="strin"+"g";就指向字符串常量池中的string。所以第一种情况为true,第二种为false
      

  3.   

    那么像Integer,Double等基本类型的封装类,是不是也有类似于String"字符池"的一块存储区域???
      

  4.   

    跟常量无关
    我的理解是:
    一个比较值,
    一个比较地址。
    new String()创建了新的地址空间了
      

  5.   

    ==比较的是引用的地址是否相同。虽然指向同一对象,但是地址簿一样。若换成equals着返回true了。
      

  6.   

    Java运行环境有一个字符串池,由String类维护。执行语句String s="abc"时,首先查看字符串池中是否存在字符串"abc",如果存在则直接将"abc"赋给s,如果不存在则先在字符串池中新建一个字符串 "abc",然后再将其赋给s。 
    执行语句String s=new String("abc")时,不管字符串池中是否存在字 符串"abc",直接新建一个字符串"abc"(注意:新建的字符串"abc"不是在字符串池中),然后将其付给s。 前一语句的效率高,后一语句的效率低,… 不错