每次调用此函数时,此函数是否都会创建一个新的String?

时间:2012-01-12 23:22:05

标签: java string

public String toString()
{
     return "NotSubscribed";
}

我们正试图在实例化对象后限制String在我们的应用程序中的创建。所以,只是想知道每次调用这个toString时是否会创建一个新的String。这可能是一个糟糕的问题,但我不知道答案。请建议。

-

我只记得如果创建了一个String,它就存储在String Pool中,之后总是从池中检索它而不重新创建。我是对的吗?

1 个答案:

答案 0 :(得分:9)

不,每次都不会创建另一个字符串。字符串常量是 interned - 所以实际上常量“NotSubscribed”将在整个代码中引用相同的字符串对象,甚至不是每次都执行此方法。

来自section 3.10.5 of the Java Language Specification

  

每个字符串文字都是类String(第4.3.3节)的实例(第4.3.1节,第12.5节)的引用(第4.3节)。 String对象具有常量值。字符串文字 - 或者更一般地说,是作为常量表达式的值的字符串(第15.28节) - 使用String.intern方法“实现”以便共享唯一的实例。

但是,在你的编辑中:

  

我只记得如果创建了一个String,它就存储在String Pool中,之后总是从池中检索它而不重新创建。我是对的吗?

不,那不对。默认情况下,仅限字符串常量。例如,每次运行此代码时:

public List<String> createStrings() {
    List<String> list = new ArrayList<String>();
    for (int i = 0; i < 10; i++) {
        list.add("foo" + i);
    }
    return list;
}

...这将创建另外10个字符串。