Java - String&恒定的池

时间:2015-02-13 07:41:49

标签: java string

我在java.lang.String看到了以下成员:

private final char value[];

我的问题是

以下语句是否会将文字字符串的副本复制为上面提到的char[],而常量池中也存在另一个文字字符串副本。

String b1 = new String("abc");

如果是这样,那么常数池意味着什么呢?或者我们应该阻止使用new()来创建带文字的String?


@Update

所以,根据答案,为什么String类需要一个char value[]变量,为什么不直接引用常量池中的单个副本? 如果用new String("...")创建一个字符串,如果文字池中不存在,那么该文字是否会被置于常量池中?

根据我的想象,使用new String()的唯一好处是,它可能比查询常量池更快;或者常量池有大小限制,当大小不够时它会删除旧的常量值吗?但我不确定这是否有效。


结论

所以,根据答案,new String()只能由常量池维护者本身使用,我们程序员不会。

3 个答案:

答案 0 :(得分:2)

后者是对的。使用String从文字创建new()实例绝对没有意义。

答案 1 :(得分:2)

你可以使用new,但使用" intern"指定它会有点棘手。 String的方法。 像这样:

String a = "ABC";
String b = new String("ABC").intern();
System.out.println(a == b);

输出为真,如果没有"实习生",那么它是来自常量池的副本。

String a = "ABC";
String b = new String("ABC");
System.out.println(a == b);

输出为false。 如果你查看这个String构造函数的原型,它会显示:

/**
     * Initializes a newly created {@code String} object so that it represents
     * the same sequence of characters as the argument; in other words, the
     * newly created string is a copy of the argument string. Unless an
     * explicit copy of {@code original} is needed, use of this constructor is
     * unnecessary since Strings are immutable.
     *
     * @param  original
     *         A {@code String}
     */
    public String(String original) {
        this.value = original.value;
        this.hash = original.hash;
    }

答案 2 :(得分:1)

  

java中的字符串就像任何其他编程语言一样   字符。这更像是一个处理该char的实用程序类   序列。此char序列保存在以下变量中:

/** The value is used for character storage. */
private final char value[];

使用new关键字创建字符串

String b1 = new String("abc");

然后将对象创建到Heap Memory中,当Java Compiler遇到任何字符串文字时,它会在常量池中创建一个对象

现在b1指向堆内存中的对象,并且因为字符串文字也在那里,所以在常量池中也创建了一个没有人指向的对象

正如有效的Java第二版所述

String s = new String("neerajjain");  //DON'T DO THIS!

因为当只能通过1个对象完成工作时,您不必要地创建了2个对象。

但在某些情况下您可以使用new String("string")找到它们here