2016-05-22 6 views
2

"Flyweight"のGOF定義によれば、同様の種類のオブジェクトを共有してメモリの使用量を削減します。Javaは文字列でFlyweightデザインパターンを実装していますか?

この場合、java stringオブジェクトは文字列定数プールを使用して同じ権利を行います。次に、Java StringがFlyweightのデザインパターンを実装していると言えますか?そうでない場合、なぜですか?

+0

これはあなたの質問に答えるかもしれないと思います。 http://stackoverflow.com/questions/2909848/how-does-java-implement-flyweight-pattern-for-string-under-the-hood – Dale

+0

私はそれを調べました、それは正当な理由がないのですか? – Aditya

答えて

5

Java Stringは、Flyweightデザインパターンを実装していますか?

実際はありません。あるいは、あなたはそれががそのパターンを実装できると言うことができます。

ストリング定数プールのみに対応Stringオブジェクト含ま:

  • Java文字列>>リテラル< <ソースコード、
  • 他のコンパイル時文字列定数、及び
  • 文字列オブジェクト内のString.intern()メソッドを呼び出すアプリケーションまたはライブラリメソッドによって意図的に「インターナショナル」にされています。

通常のJava Stringオブジェクトは文字列プールには作成されません。代わりに、通常のヒープで作成され、intern()の呼び出しによって「プールに入れられる」だけです。これは正当な理由によるものです。すべての文字列がデフォルトでインターンされていると、GCオーバーヘッドや標準的なJavaアプリケーションの長期メモリフットプリントが増加します。

(ジャワ8は今等しい文字列の文字列を組み合わせることにより、スペースを節約G1のコレクタに任意string deduplication featureを有することに留意されたい。)

+0

通常のJava文字列はどういう意味ですか? javaの各文字列は定数が正しいですか?だから、Constantプールで作成する必要がありますか? – Aditya

+2

私は、文字列コンストラクタまたはメソッドのうちの1つを呼び出すことによって( 'intern'から離れて)生成されるStringを意味します。文字列が不変であるということは、文字列が(必然的に)プール内に作成されたことを意味しません。 –

+0

あなたが私を信じていない場合は、Javaのソースコードを確認してください。 –

2

はい、Javaの文字列プールがフライウェイトパターンの良い例であります。 wikipedia article on the subject

[このパターンの]もう1つの例は文字列インターネットです。

+1

Wikipediaの記事は正しいですが、あなたの結論は完全に正しいわけではありません。文字列_interning_はパターンの例ですが、全体としてOPによって使用される "Java String"には当てはまりません。 –

+0

インターンは、フライウェイトよりもキャッシングに近いです。 IMHOラインはここでもぼやけています。 – Bohemian

関連する問題