ホームページ >Java >&#&チュートリアル >「CaseInsensitiveString cis = new CaseInsensitiveString('Polish')」は受け入れられるのに、「String s = new String('silly')」はメモリ最適化のために推奨されないのはなぜですか

「CaseInsensitiveString cis = new CaseInsensitiveString('Polish')」は受け入れられるのに、「String s = new String('silly')」はメモリ最適化のために推奨されないのはなぜですか

DDD
DDDオリジナル
2024-11-14 14:09:02373ブラウズ

Why is

Java 文字列メモリの最適化: "String s = new String("silly")" について

次の推奨事項に関して懸念が提起されました。 「String s = new String("silly")」のような Java コードの記述は避けてください。このアドバイスは String オブジェクトの場合のメモリ使用量の最適化には有効ですが、他のクラスには適用できない可能性があります。

「CaseInsensitiveString cis = new CaseInsensitiveString("Polish")」が受け入れられるのはなぜですか?

オブジェクト「cis」は CaseInsensitiveString クラスのインスタンスです。 String とは異なり、CaseInsensitiveString はオブジェクトを作成するためにコンストラクターを必要とするユーザー定義クラスです。したがって、指定した文字列値でオブジェクトを初期化するには、構文 "CaseInsensitiveString cis = new CaseInsensitiveString("Polish")" が必要です。

CaseInsensitiveString をリテラル初期化の String のように動作させるにはどうすればよいですか?

String の場合と同様に CaseInsensitiveString のリテラル初期化を有効にするには、以下を実装できます:

  • カスタム ファクトリ メソッドを作成します: 静的メソッドを定義します。 CaseInsensitiveString クラスでは、引数としてリテラルを受け取り、その値で初期化されたクラスのインスタンスを返します。このメソッドは、文字列リテラルに対して発生する暗黙的なコンストラクター呼び出しを模倣します。
  • valueOf() メソッドを実装します。 Object から継承された valueOf() メソッドをオーバーライドします。このメソッドは、Java によって内部的に使用されます。リテラルから新しい String インスタンスを作成します。カスタム実装を提供すると、リテラルから直接新しい CaseInsensitiveString オブジェクトを作成できます。

リテラルを String に直接渡しても問題ないのはなぜですか?

String Javaの特別なクラスです。これには、インターンされた文字列の事前定義されたプールがあり、重複する文字列リテラルが同じオブジェクトへの参照として保存されます。これにより、同じ文字列値に対して複数の String オブジェクトを使用する必要がなくなり、メモリ消費が削減されます。

以上が「CaseInsensitiveString cis = new CaseInsensitiveString('Polish')」は受け入れられるのに、「String s = new String('silly')」はメモリ最適化のために推奨されないのはなぜですかの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。