关于java:Java中String对象的引用


1、创立

通过字面量创立的String对象和new的String对象不同。字面量创立的对象在常量池中,new创立的对象在堆中。

    //String对象
    //间接用引号创立的String对象在pool中
    String s1 = "abc";
    String s2 = "abc";
    System.out.println(s1 == s2); // true  s2是从pool中间接取出"abc"对象的援用

    //new创立的String对象在heap中
    String s3 = new String("abc");
    String s4 = new String("abc");
    System.out.println(s3 == s4); // false  两个对象都在heap中,地址不同

    //heap中的对象和pool中的对象不是同一个
    System.out.println(s2 == s3); // false

2、intern()办法

官网解释:

民间解释:

当intern办法执行时,如果pool中曾经存在一个和以后对象雷同的字符串,就返回pool中的那个,否则,将以后对象增加到pool中并返回。

返回值:一个和以后对象雷同的字符串,但保障取自具备惟一字符串的池。

    String s5 = "abc";
    String s6 = new String("abc");
    System.out.println(s6.intern() == s5); // true  s6.intern()取自pool

3、拼接

字符串间接拼接会放入常量池中,只创立一个拼接后对象。通过变量拼接,会调用StringBuilder的append办法进行拼接,返回对象为new String()。

    String s1 = "a";
    String s2 = "ab";
    String s3 = "a" + "b";
    String s4 = s1 + "b";
    System.out.println(s2 == s3); // true
    System.out.println(s2 == s4); // false
    System.out.println(s3 == s4); // false

4、问题:

上面的代码创立了几个对象:

String s = “a” + “b” + “c”; // 1个 在常量池中,编译时曾经合并
String s = new String(“abc”); // 2个,常量池中一个,堆中一个
<新手上路>

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理