`

string对象

 
阅读更多
/**
 * @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
    }
}

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics