0

次のコードはいくつのStringオブジェクトを生成しますか?

String s1="Hello"; //"Hello" is in String Pool Object #1
String s2 = s1.substring(2,3);//String object #2
String s3 = s1.toString();
String s4 = new StringBuffer(s1).toString(); //String Object #3

これは、私が読んでいるJavaの本の練習に対する質問です。答えがないので、私の答えが正しいかどうかはわかりません。3つまたは5つの文字列オブジェクトが作成されていますか?toString()は新しいStringオブジェクトを作成しますか?オンラインで調べたところ、toString()が「オブジェクトの文字列表現を返す」ことがわかりました。これが何を意味するのかよくわかりません。

4

5 に答える 5

7

3つ作成します。あなたの分析は正しいです。

toString()は新しいStringオブジェクトを作成しますか?オンラインで調べたところ、toString()が「オブジェクトの文字列表現を返す」ことがわかりました。

これはジェネリックの説明ですが、Object.toStringよりString具体的な動作を与えるためにそれをオーバーライドします。そのバージョンは次のように文書化されています。

このオブジェクト(すでに文字列です!)自体が返されます。

[リンク]

于 2012-11-09T04:43:05.217 に答える
4

あなたは正しいと思います。Stringオブジェクトの数は5ではなく3になります。

s1.toString();javadocによると:

このオブジェクト(すでに文字列です!)自体が返されます。

new StringBuffer(s1)

新しいStringオブジェクトを作成します。

于 2012-11-09T04:42:41.950 に答える
3

新しいキーワードを使用して文字列オブジェクトを作成すると、文字列が文字列のプールにすでに存在していても、新しい文字列オブジェクトが作成されます。

String s1="Hello"; //this will create a new string object and add it to the pool of strings

String s2 = s1.substring(2,3);//String object #2 again creates a string and adds it in the pools of strings
String s3 = s1.toString();//this will not create a new object but simply refer to already existing object in the pool of strings
String s4 = new StringBuffer(s1).toString(); //String Object #3 this will create a new object as you are using new keyword 

public class Main {
    public static void main(String[] args) {
        String s1 = "abc";//created a string and added it to pool of string
        String s2 = "abc";//no need to create a new object
        String s3 = new String("abc");
        System.out.println("s1 = " + s1);
        System.out.println("s2 = " + s2);
        System.out.println("s2 = " + s3);
        System.out.println("s1 == s2? " + (s1 == s2));//proves that the ref refer to same object
        System.out.println("s1 == s3?"+ (s1==s3));
        System.out.println("s1.equals(s2)? " + (s1.equals(s2)));    
  }
}

出力

s1 = abc
s2 = abc
s3 = abc
s1 == s2? true
s1 == s3? false
s1.equals(s2)? true
于 2012-11-09T04:52:07.397 に答える
0

あなたの質問に対する答えは、実装に依存し、誤解を招くものです。コードフラグメントの終わりまでに2〜4個の「文字列オブジェクト」が存在する可能性があります。正確には、JVMに依存する数と、インターンの小さな文字列(あるとしても)がどれだけ積極的に存在するかを示します。指摘されているように、JDKのドキュメントではString.toString()がオブジェクトを返すように指定されているため、答えは「2または3」である必要があります。ただし、この動作に依存するのは非常に愚かです。

これが誤解を招くと私が言う理由は、「文字列オブジェクトの数」について心配する必要がないからです。Javaのオブジェクトは非常に軽量であり、それらを数えることを心配する必要はありません。

私が追加する唯一の資格は、オブジェクト数は気にしないが、参照は気にするということです。文字列の場合、厄介な驚きは、基になるchar配列への参照の数です。文字列オブジェクトはchar配列を共有するフライウェイトであり、これを忘れると深刻なメモリリークが発生する可能性があります。Javaプログラムのヒープを使い果たす非常に簡単な方法は、次のとおりです。

while(!multiGBFileEOF) {
    String bigString = readMultiMBString();
    int index = findSmallFeature(bigString);
    String featureOfInterest = bigString.substring(index, index+4);
    featureList.add(featureOfInterest);
}

featureListは、最大で数10KB(各1000リストアイテム*(arrayrefの場合は4〜8バイト+オブジェクトの場合は12〜20バイト+ char配列の場合は8〜16バイト))、つまり些細なものになるはずです。一部の一般的なJVM実装は、substring()によって生成された文字列のバッキング配列を共有します。これにより、ファイル全体をメモリに格納しようとする可能性があります。解決策は、を呼び出して基になる配列の明示的なコピーを強制するString copy = new String(featureOfInterest)ことです。ここでは気にしません。copyとが同じオブジェクトであるかどうかは、背後のchar配列をエイリアスしないfeatureOfInterest限りです。copybigString

あなたの学習で頑張ってください。

于 2012-11-09T05:28:19.847 に答える
0

3文字列オブジェクトを作成します。StringクラスのtoString()メソッド実装は、コンテンツを出力します。新しいオブジェクトは作成されません。

于 2012-11-09T05:39:04.030 に答える