package StringTest.equalTest;
/**
*
* <p>Description:测试 string pool </p>
* <p>Company: sinosoft</p>
* @author 黄大洋
* @date 2014-8-26
*
*/
public class equalTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
System.out.println("start");
String a = "abc";
String b = "abc";
System.out.println(a ==b); //true
//一个对象,默认不放到String池中
String c1 = new String("aaa");
String c2 = "aaa";
System.out.println(c1==c2); //false
//一个对象,默认不放到String池中
String c3 = new String("bbb").intern();
String c4 = c3.intern();
String c5 = "bbb";
System.out.println("c3==c4:"+(c3==c4)); //true
System.out.println("c3==c5:"+(c3==c5));//true
//两个对像
String d1 = new String("ddd");
String d2 = new String("ddd");
System.out.println(d1 == d2); //false;
//关于操作
String zz1 = "zz1";
String b1 = "zz";
String cc1 =b1+"1";
System.out.println(zz1==cc1); //变量+常量 ,false带十号重新创建一个new String
//关于操作
String yy2 = "yy2";
String b2 = "yy";
String zz = "2";
String cc =b2+zz;
System.out.println(yy2==cc); //false 变量+变量 ,带十号重新创建一个new String
String yy3 = "xx3";
//String b3 = "xx";
//String dd = "3";
String ee ="xx"+"3";
System.out.println(yy3==ee); //true 常量+常量,jvm优化成一个常量。
//自加
String a1 ="abcd";
String a2 ="abcd";
String a3 ="ab";
a3+="cd"; //abcd
System.out.println(a1==a2); //true
System.out.println(a3==a2); //false 自加,变量加长量
}
}
总结:
方法中的String常量是放在Stirng pool中的,
关于有+操作符的。自加,和加,只要表达式中产生有变量,则运算的结果是个new String,
如果两个String常量相加,通过反编译,可以看到译器有个优化。把两个常量相加变成了一个常量。
gc:回收 结果new String的方法执行完后,可回收。常量将放在String 对象池中。
反编译class:
package StringTest.equalTest;
import java.io.PrintStream;
public class equalTest
{
public static void main(String[] args)
{
System.out.println("start");
String a = "abc";
String b = "abc";
System.out.println(a == b);
String c1 = new String("aaa");
String c2 = "aaa";
System.out.println(c1 == c2);
String c3 = new String("bbb").intern();
String c4 = c3.intern();
String c5 = "bbb";
System.out.println("c3==c4:" + (c3 == c4));
System.out.println("c3==c5:" + (c3 == c5));
String d1 = new String("ddd");
String d2 = new String("ddd");
System.out.println(d1 == d2);
String zz1 = "zz1";
String b1 = "zz";
String cc1 = b1 + "1";
System.out.println(zz1 == cc1);
String yy2 = "yy2";
String b2 = "yy";
String zz = "2";
String cc = b2 + zz;
System.out.println(yy2 == cc);
String yy3 = "xx3";
String ee = "xx3";
System.out.println(yy3 == ee);
String a1 = "abcd";
String a2 = "abcd";
String a3 = "ab";
a3 = a3 + "cd";
System.out.println(a1 == a2);
System.out.println(a3 == a2);
}
}