3

Javaのベストプラクティスに関するアドバイスを読んでいたところ、次のようなアイデアが浮かびました。

また、Stringオブジェクトをインスタンス化する場合は常に、そのコンストラクターを使用せず、常に直接インスタンス化してください。

例えば:

//slow instantiation
String slow = new String("Yet another string object");

//fast instantiation
String fast = "Yet another string object";

どうしてこれなの?'fast'はデフォルトの文字列コンストラクターを呼び出しませんか?

4

2 に答える 2

9

使用すると新しい文字列オブジェクトnewが取得されますが、文字列リテラルを使用する場合はここを参照してください

コンピュータサイエンスでは、文字列のインターンは、不変でなければならない個別の文字列値のコピーを1つだけ保存する方法です。文字列をインターンすると、一部の文字列処理タスクの時間効率またはスペース効率が向上しますが、文字列の作成またはインターン処理により多くの時間が必要になります。個別の値は文字列インターンプールに格納されます。各文字列の単一のコピーは「intern」と呼ばれ、通常、JavaのString.intern()などの文字列クラスのメソッドによって検索されます。Javaのすべてのコンパイル時定数文字列は、このメソッドを使用して自動的にインターンされます。

もし、するなら:

String a = "foo";
String b = "foo";

それなら本当a==bです!

文字列は、インターンされていない場合にのみ作成されます。オブジェクトは最初に作成され、文字列定数プールと呼ばれる場所に格納されます。

ただし、newこれを使用すると、文字列ごとに異なるオブジェクトが作成され、falseが出力されます。

String a = new String("foo");
String b = new String("foo");

a==bです。

したがって、リテラルを使用すると、読みやすくなり、コンパイラーが最適化を行うのも簡単になります。だから..あなたができるときにそれを使用してください。

于 2013-03-26T19:57:55.737 に答える
1

JVMは、String最適化のためにリテラルのプールを維持します。Stringコンストラクターを使用して作成する場合、

String s1 = new String("foo");

新しいStringオブジェクトが作成され、リテラル"foo"がプールに追加されます。"foo"この後、コードで使用するときはいつでも"foo"、はプール内のアイテムを参照し、新しいオブジェクトは作成されません。は不変であるためString、問題は発生しません。

したがってString、「ショートカット」を使用して作成する場合:

String s2 = "foo"

JVMはプールを調べます。"foo"すでにプールに存在する場合s2は、プール内のアイテムを参照します。

これは、パフォーマンスに影響を与える可能性のある大きな違いです。コンストラクターは常にオブジェクトを作成し、リテラルがプールにまだ存在しない場合はプールに追加します。ショートカットはプール内のアイテムを参照し、liuteralがプール内にない場合にのみ新しいオブジェクトを作成します。

于 2013-03-26T20:05:07.750 に答える