乐趣区

关于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 个,常量池中一个,堆中一个
< 新手上路 >

退出移动版