/**
* @author fxliu
* @version 1.0
*/
public class TestString
{
public static void main(String args[])
{
String s = new String("abc");
/*生成了两个对象,一个abc是在String pool里面,一个abc是在内存的堆里面,s是指向堆里面的一个对象,
* 只有用new关键字生成出来的才叫对象,s是指向堆里面对象的地址
* */
String s1 = "abc";
/* 当执行完这行语句,一个新的对象也没有生成,只是定义一个字符串常量,而不是用new的时候,会在string pool里面查找
是否已经存在了abc这样一个对象,如果已经存在就直接使用
* */
String s2 = new String("abc");
/*首先查找abc在string pool里面是否存在,如果已经存在就在string pool里不再创建
只要有new就会在堆里面生成一个新的对象,
* */
System.out.println(s == s1);
System.out.println(s == s2);
System.out.println(s1 == s2);
/*==是判断他们引用的地址是否一样
s1——>abc是string pool里面的
s——>abc是堆里面的
s2——>abc是另一个堆里面的
三个不同的对象,指向不同的地方
*/
/* 运行结果
false
false
false*/
//首先intern()是返回poo里面的对象
System.out.println(s == s.intern());//false s是堆里面的,s.intern()是pool里面的所以返回false
System.out.println(s1 == s1.intern());//true s1是pool,s1.intern()也是pool里面
System.out.println(s.intern() == s2.intern());//true,都是pool里面的
String h = "hellolili";
String h1 = "hello";
String name = "lili";
/*==========================================*/
System.out.println("=================");
System.out.println(h == "hello" + "lili");//true 只是两个常量,它都是指向pool里面的
System.out.print(h == "hello" + name);//false,name新创建了一个对象是指向堆里面的,所以返回为false
}
}