2014-01-13 12 views
5

私はjavaの文字列が不変であることを知っています。 Javaの文字列にある文字を置き換える一連のメソッドがあります。 これらのメソッドが呼び出されるたびに、新しいStringの作成が必要になるため、空間の複雑さが増したり、元のString自体で置き換えが行われたりします。私はこのコンセプトについて、コード内のこれらの置換ステートメントが毎回新しいStringを生成してメモリを消費するかどうかについて少し混乱していますか?文字列でreplaceAll()が使用されるたびに新しい文字列が作成されますか?

+15

「私はJava Stringsが不変であることを知っています。 –

+5

文字列が[不変](http://i.imgur.com/JYJycB4.jpg) – gtgaxiola

+0

であることはわかりません[String interning](http://en.wikipedia.org/wiki)に精通していますか?/String_interning)? – MariuszS

答えて

3

JavaのオブジェクトStringが不変であることに注意してください。置換、部分文字列などのメソッドが新しいオブジェクトを作成しない唯一のケースは、置換がノーオペレーションである場合です。たとえば、"Hello, world!"文字列にあるすべての'x'文字を置換するように要求すると、新しいStringオブジェクトは作成されません。同様に、str.substring(0)を呼び出すと、文字列全体が返されるため、新しいオブジェクトはありません。それ以外の場合は、戻り値が元の値と異なる場合は、新しいオブジェクトが作成されます。

+2

「Hello world」に「x」がないことがわかってからしばらく時間がかかりました。一瞬そこに私は自分自身を疑っていた.. –

0

それはwill return a new Stringですが、呼び出しがいくつかの巨大ループや再帰関数の一部でない限り、あまり心配する必要はありません。

しかし、意図的にシステムをクラッシュさせたい場合は、何らかの方法で考えることができます。

+0

@nachokk - 賞金 – Coffee

1

毎回新しいものを生成します。それは不変であることに帰結します。

ある意味では、「空間の複雑さ」が増加するということは、置換のための最も効率的な可能なアルゴリズムよりも多くのメモリを使用するということですが、それほど悪くはありません。 replaceAll操作中に作成された一時オブジェクトやそのようなものは、すばやくガベージコレクションされます。 javaは、一時オブジェクトを収集するガベージコレクションで非常に効率的です。いくつかのガベージコレクションの基礎については、興味深い記事を書くためにhttp://www.infoq.com/articles/Java_Garbage_Collection_Distilledを参照してください。

0

何らかの理由で文字列の変更操作がJDKで失敗する、つまりStringBuilderは置換機能を実装していません。

可能なオプションは、第三者のライブラリ、つまりMutableStringを使用することです。 available in Maven Centralです。

1

はい。あなたはそれを正しく指摘しました。 String型の不変性にはいくつかの影響があります。

これは、Javaの設計者が、charシーケンスで操作を実行するときに使用する別のタイプを持っている理由です。

StringBuilderと呼ばれるクラスは、置換のような文字操作を含む多くの操作を実行するときに使用する必要があります。もちろん、それはより堅牢で細部にもっと注意を払う必要がありますが、それはあなたがパフォーマンスを気にするときにはすべてです。

したがって、String型の不変性はメモリ使用量を増加させません。 String型の使い方が間違っています。

関連する問題