1

これは Java String 101 の一部です。最近、いくつかの既存のコードでこれに出会いました。私の最初の反応は、これは冗長だということです

car.setDetails(new String(someStringBufferObj.toString));

私の意見では、これでも冗長になります...

car.setDetails(new String(someOtherStringObj));

someOtherStringObjString は不変であるため、コードの後の行で( を変更することによって) 車の詳細が誤って変更されるリスクはありません。

私は間違っていますか?

4

2 に答える 2

2

上記の最初のスニペットは不要に見えます。ただし、2 番目が必要な場合があります。以下を検討してください。

コンストラクターは、元の文字列の基になる文字配列のコピーString(String)を取得するので便利です。

なぜこれが便利なのですか?文字列オブジェクトにはその基になる文字配列がsubstring()あり、既存の文字列を取得すると実際には元の文字配列が使用されることを理解する必要があります。フライ級のパターンです。次のことを考慮してください

String s = longstring.substring(2,4);

文字列sは、基になる文字配列を指しますlongstring(やや直感的ではありません)。longstring(ガベージ コレクションを使用して) ビンに入れたい場合、基礎となる文字配列まだ参照されているためビンにs入れられず、2 文字の文字列に膨大な量のメモリを消費する可能性があります。

コンストラクターは、String(String)構築元の文字列によって参照される文字配列から新しい文字配列を作成することで、これを解決します。元の文字列がガベージ コレクションによって削除されると、その文字配列はsubstring()結果によって参照されないため、それも削除されます。

この動作はごく最近 Java (リリース 7u4 だと思います) で変更され、文字列は上記の操作モードをサポートしなくなったことに注意してください。

于 2013-02-13T14:38:59.497 に答える
0

Rob さんの言うとおりです。この場合、String を新しく作成する必要はありません。someStringBufferObj.toString() への呼び出しを提供するだけで十分です!

于 2013-02-13T14:37:39.763 に答える