3

我知道使用 String 的大多数方法将返回一个新的字符串对象,该对象将添加到字符串池中,并且作为参数传递给这些方法的字符串文字也将添加到字符串池中。

例如,下面的代码将创建三个字符串对象,即:“Hello”、““World!”和“Hello World!” 它们被添加到字符串池中,这意味着传递给 concat() 方法的参数被添加到字符串池中。

我很想知道传递给 StringBuilder.append() 方法的字符串文字参数和 StringBuilder 中的任何其他方法是否被添加到字符串池中。

或者也许我应该问是否所有传递给任何其他类中的任何其他方法的字符串文字参数也都添加到字符串池中?

我还想添加基于 java 6 的我知道的这些事实。

String s = "Hello " ;
s = s.concat("World!") ;
4

3 回答 3

4

我很想知道传递给 StringBuilder.append() 方法的字符串文字参数和 StringBuilder 中的任何其他方法是否被添加到字符串池中。

或者也许我应该问是否所有传递给任何其他类中的任何其他方法的字符串文字参数也都添加到字符串池中?

所有字符串文字都放入字符串池中。你如何使用文字是无关紧要的。

于 2014-08-10T19:36:00.857 回答
3

没有任何String方法(旁边intern())将填充字符串池。没有一种方法可以StringBuilder做到这一点。将类加载到常量池时添加文字。因此,如果您调用 concat() 它会获得一个内部常量对象引用。但是 concat 没有做任何事情来实习它,或者什么都不做,这取决于它是否被实习。

于 2014-08-10T19:32:45.887 回答
1

从 Java 1.7 开始:-

 public String concat(String str) {
        int otherLen = str.length();
        if (otherLen == 0) {
            return this;
        }
        int len = value.length;
        char buf[] = Arrays.copyOf(value, len + otherLen);
        str.getChars(buf, len);
        return new String(buf, true);
    }

除非您使用String.intern()String 文字,否则您不会将其添加到字符串池中

于 2014-08-10T19:32:19.110 回答