public class TestObjec {
   public static String a = "xy";    public static void main(String[] args)
 {
  String b = new String("x");
  String c = new String("y");
  String b1 = "x";
  String c1 = "y";
  
  String d = b + c;
  String e = "x" + "y";
  String f = b1 + c1;
  String g = "xy";
  
  System.out.println(TestObjec.a==d);
  System.out.println(TestObjec.a==e);
  System.out.println(TestObjec.a==f);
  System.out.println(TestObjec.a==g);
  System.out.println(g==d);
  System.out.println(g==e);
  System.out.println(g==f);
 }

解决方案 »

  1.   

    TestObjec.a==dTestObjec.a是该类的属性,d也是该类的属性。把d赋值给TestObjec.a。然后输出这个属性的值,也就是输出d的值。剩下的就不用说了。这样理解可以吗?
      

  2.   

    分别看看他们的内存地址是否相等,我没试~hehe 
      

  3.   

      public static String a = "xy";            静态池1--->String常量池  String b = new String("x");             堆1  string常量池 1
      String c = new String("y");              堆1  string常量池 1  String b1 = "x";                         string常量池 1
      String c1 = "y";                         string常量池 1  String d = b + c;                         
      String e = "x" + "y"; 
      String f = b1 + c1; 
      String g = "xy"; 
      
      System.out.println(TestObjec.a==d);         flase
      System.out.println(TestObjec.a==e);         true
      System.out.println(TestObjec.a==f);      flase
      System.out.println(TestObjec.a==g);        true
      System.out.println(g==d);   flase
      System.out.println(g==e);   true
      System.out.println(g==f);   flase
      

  4.   


    public class TestObjec { 
      public static String a = "xy";   public static void main(String[] args) 

      String b = new String("x"); //new一个b指向"x"
      String c = new String("y"); //new一个c指向"y"
      String b1 = "x"; //定义变量b1值为"x"
      String c1 = "y"; //定义变量c1值为"y"
      
      String d = b + c; //连接b,c给d(连接后重新有位置在date segement)相当于在date segement重新分配一个"xy"  d指向那里
      String e = "x" + "y"; //定义变量e,直接指向xy
      String f = b1 + c1; //还是定义变量,内存做法同String d = b + c;
      String g = "xy"; //继续定义变量,直接指向xy
      
      System.out.println(TestObjec.a==d); //==为比较引用是否相同.false
      System.out.println(TestObjec.a==e); //同上,true
      System.out.println(TestObjec.a==f); //同上,false
      System.out.println(TestObjec.a==g); //同上,true
      System.out.println(g==d); //false  
      System.out.println(g==e); //true
      System.out.println(g==f); //false


      

  5.   

    1 所有直接写成String s = "XY";的,将从静态区域读取,且会出现地址相同的2 所有用new 的,都会重新从堆里分配,所以不会相等3 所有用了操作符的,比如 "XY+"Z" 则同2
      

  6.   

    其实此类问题javap一下通通明了了...
      

  7.   

    如何解释System.out.println(TestObjec.a==e)结果为true???
      

  8.   

    你可以Java p看一下类汇编的jvm指令
    你会看到编译器会自动判断字符串是否在idle池里面 如果是就直接引用池内的字符串否则创建新对象至于+操作符这些编译器在编译时都自动给你优化了
      

  9.   

    public class TestObjec { 
      public static String a = "xy";   public static void main(String[] args) 

      String b = new String("x"); 
      String c = new String("y"); 
      String b1 = "x"; 
      String c1 = "y"; 
      
      String d = b + c; 
      String e = "x" + "y"; 
      String f = b1 + c1; 
      String g = "xy"; 
      
      System.out.println(TestObjec.a==d);//d是新生成了一个String对象 
      System.out.println(TestObjec.a==e);//e是直接重常量池中返回的,跟a一样 
      System.out.println(TestObjec.a==f);//f会新生成了一个String对象 
      System.out.println(TestObjec.a==g);//都是从常量池中直接返回的 
      System.out.println(g==d); //d是新生成了一个String对象
      System.out.println(g==e); //都是从常量池中直接返回的
      System.out.println(g==f); //f会新生成了一个String对象


    ---------------------------------
      

  10.   

    注意:e="x"+"y"<=>e="xy";
    但,f=b1+c1,虽然b1="x",c1="y",但java还是当作
    变量来看待,所以f会新生成一个string对象。
      

  11.   

    如果加了itern()这个方法又会不同
    请看
    -------------
    public class TestObjec { 
      public static String a = "xy";   public static void main(String[] args) 

      String b = new String("x"); 
      String c = new String("y"); 
      String b1 = "x"; 
      String c1 = "y"; 
      
      String d = b + c; 
      String e = "x" + "y"; 
      String f = b1 + c1; 
      String g = "xy"; 
      String h=(b1+c1).intern();
      
      System.out.println(TestObjec.a==d);//d是新生成了一个String对象 
      System.out.println(TestObjec.a==e);//e是直接重常量池中返回的,跟a一样 
      System.out.println(TestObjec.a==f);//f会新生成了一个String对象 
      System.out.println(TestObjec.a==g);//都是从常量池中直接返回的 
      System.out.println(g==d); //d是新生成了一个String对象
      System.out.println(g==e); //都是从常量池中直接返回的
      System.out.println(g==f); //f会新生成了一个String对象
      System.out.println(TestObjec.a==h); //itern()方法会首先考虑常量池的