3

String のほとんどのメソッドを使用すると、文字列プールに追加される新しい文字列オブジェクトが返され、これらのメソッドに引数として渡される文字列リテラルも文字列プールに追加されることがわかっています。

たとえば、次のコードは、"Hello "、""World!""、"Hello World!" という 3 つの文字列オブジェクトを作成します。これらは文字列プールに追加され、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() を呼び出すと、インターンされた定数オブジェクト参照が取得されます。しかし、連結はそれをインターンするために何もしていないか、インターンされていることに依存していません。

于 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 リテラルを使用しない限り、それを String プールに追加することはありません

于 2014-08-10T19:32:19.110 に答える