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);
}
}
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);
}
}
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
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
}
}
你会看到编译器会自动判断字符串是否在idle池里面 如果是就直接引用池内的字符串否则创建新对象至于+操作符这些编译器在编译时都自动给你优化了
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对象
}
}
---------------------------------
但,f=b1+c1,虽然b1="x",c1="y",但java还是当作
变量来看待,所以f会新生成一个string对象。
请看
-------------
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()方法会首先考虑常量池的}
}