私はjavaの文字列が不変であることを知っています。 Javaの文字列にある文字を置き換える一連のメソッドがあります。 これらのメソッドが呼び出されるたびに、新しいStringの作成が必要になるため、空間の複雑さが増したり、元のString自体で置き換えが行われたりします。私はこのコンセプトについて、コード内のこれらの置換ステートメントが毎回新しいStringを生成してメモリを消費するかどうかについて少し混乱していますか?文字列でreplaceAll()が使用されるたびに新しい文字列が作成されますか?
答えて
JavaのオブジェクトString
が不変であることに注意してください。置換、部分文字列などのメソッドが新しいオブジェクトを作成しない唯一のケースは、置換がノーオペレーションである場合です。たとえば、"Hello, world!"
文字列にあるすべての'x'
文字を置換するように要求すると、新しいString
オブジェクトは作成されません。同様に、str.substring(0)
を呼び出すと、文字列全体が返されるため、新しいオブジェクトはありません。それ以外の場合は、戻り値が元の値と異なる場合は、新しいオブジェクトが作成されます。
「Hello world」に「x」がないことがわかってからしばらく時間がかかりました。一瞬そこに私は自分自身を疑っていた.. –
それはwill return a new Stringですが、呼び出しがいくつかの巨大ループや再帰関数の一部でない限り、あまり心配する必要はありません。
しかし、意図的にシステムをクラッシュさせたい場合は、何らかの方法で考えることができます。
@nachokk - 賞金 – Coffee
毎回新しいものを生成します。それは不変であることに帰結します。
ある意味では、「空間の複雑さ」が増加するということは、置換のための最も効率的な可能なアルゴリズムよりも多くのメモリを使用するということですが、それほど悪くはありません。 replaceAll操作中に作成された一時オブジェクトやそのようなものは、すばやくガベージコレクションされます。 javaは、一時オブジェクトを収集するガベージコレクションで非常に効率的です。いくつかのガベージコレクションの基礎については、興味深い記事を書くためにhttp://www.infoq.com/articles/Java_Garbage_Collection_Distilledを参照してください。
何らかの理由で文字列の変更操作がJDKで失敗する、つまりStringBuilder
は置換機能を実装していません。
可能なオプションは、第三者のライブラリ、つまりMutableString
を使用することです。 available in Maven Centralです。
はい。あなたはそれを正しく指摘しました。 String型の不変性にはいくつかの影響があります。
これは、Javaの設計者が、charシーケンスで操作を実行するときに使用する別のタイプを持っている理由です。
StringBuilderと呼ばれるクラスは、置換のような文字操作を含む多くの操作を実行するときに使用する必要があります。もちろん、それはより堅牢で細部にもっと注意を払う必要がありますが、それはあなたがパフォーマンスを気にするときにはすべてです。
したがって、String型の不変性はメモリ使用量を増加させません。 String型の使い方が間違っています。
- 1. 文字列でReplaceAllメソッドが
- 2. 文字列のテキストファイルをスキャンすると、その文字列で新しいtxtファイルが作成されます
- 3. C++の文字列は、すでに初期化された他の文字列からインデックス文字をコピーして形成されます。 coutを使って新しく形成された文字列を印刷することができません
- 4. でReplaceAll()を使用して文字列から部分文字列を削除
- 5. PHP:文字列を含むmysql_query文を実行しますが、文字列には、文字列が設定される前に呼び出されるインクルードファイルに設定された文字列が含まれています
- 6. 指定された配列の1文字おきに作成された新しい文字列を作成して返します
- 7. ASP.Net VBの文字列で使用される文字列に基づいた文字列
- 8. C++チュートリアルで文字列の配列が文字列に使用されているのはなぜですか?
- 9. 他の文字列が変更されたときに数値列が文字列に強制されます
- 10. `+ =`に似た文字列操作がありますが、文字列の先頭に追加されますか?
- 11. SQLエンコード文字列パラメータのために特殊文字が使用される
- 12. PHPが異なる文字に分割された文字列
- 13. は「A」またはランダムに生成された文字列に「」ランダムに生成された文字列
- 14. チェックした文字列は、私は、文字列が定義されている
- 15. 文字列に常に更新された文字列をバインドする
- 16. 各ループで更新される文字列と連結しない文字列
- 17. 文字列の検索でfalseが返されますが、出力に文字列が表示される
- 18. データベースに対して作成された文字列をチェックし、見つかった場合は新しい文字列を作成しますか?
- 19. JavaScriptのリテラル文字列で使用されるエスケープ文字
- 20. UITextViewからフォーマットされた文字列を既にフォーマットされた文字列に追加しますか?
- 21. JSON.parseまたはangular.fromJsonを使用してJSON文字列が解析されない文字列
- 22. 構成された文字列を使用する
- 23. 文字が文字列に変換されない
- 24. 文字列に末尾の文字が追加されない
- 25. パラメータが渡された文字列
- 26. 分割された文字列からオブジェクトを作成する
- 27. 文字列ビルダーまたは文字列クラスの文字列を作成する
- 28. 他の文字列から新しい文字列を作成する(Java)
- 29. 文字列プールで二重引用符を使用して生成された文字列が生成されない
- 30. System.out.printlnで使用される文字列も新しい不変オブジェクトを作成しますか?
「私はJava Stringsが不変であることを知っています。 –
文字列が[不変](http://i.imgur.com/JYJycB4.jpg) – gtgaxiola
であることはわかりません[String interning](http://en.wikipedia.org/wiki)に精通していますか?/String_interning)? – MariuszS