[解決済み] String リテラルに対して String の intern メソッドを使用する必要がある場合
2022-04-24 07:09:33
質問
によると
文字列#intern()
,
intern
メソッドは、文字列が文字列プールに存在する場合はその文字列を返し、存在しない場合は新しい文字列オブジェクトを文字列プールに追加してその文字列の参照を返すことになっています。
そこで、こんなことをやってみた。
String s1 = "Rakesh";
String s2 = "Rakesh";
String s3 = "Rakesh".intern();
if ( s1 == s2 ){
System.out.println("s1 and s2 are same"); // 1.
}
if ( s1 == s3 ){
System.out.println("s1 and s3 are same" ); // 2.
}
と思っていたのですが
s1 and s3 are same
はs3がインターンしているので出力されます。
s1 and s2 are same
は出力されません。しかし、結果は、両方の行が印刷されます。ということは、デフォルトではString定数はinternedになっているということです。しかし、もしそうなら、どうして
intern
というメソッドがあります。言い換えれば、このメソッドはいつ使うべきなのでしょうか?
どのように解決するのですか?
Java は自動的に String リテラルをインターンします。つまり、多くの場合、==演算子はintや他のプリミティブ値と同じように文字列に対して動作しているように見えるのです。
文字列リテラルでは自動的にインターナルが行われるため
intern()
メソッドを使用して構築された文字列に対して使用されます。
new String()
あなたの例で言うと
String s1 = "Rakesh";
String s2 = "Rakesh";
String s3 = "Rakesh".intern();
String s4 = new String("Rakesh");
String s5 = new String("Rakesh").intern();
if ( s1 == s2 ){
System.out.println("s1 and s2 are same"); // 1.
}
if ( s1 == s3 ){
System.out.println("s1 and s3 are same" ); // 2.
}
if ( s1 == s4 ){
System.out.println("s1 and s4 are same" ); // 3.
}
if ( s1 == s5 ){
System.out.println("s1 and s5 are same" ); // 4.
}
が返ってきます。
s1 and s2 are same
s1 and s3 are same
s1 and s5 are same
を除くすべてのケースで
s4
を使用して明示的に作成された値です。
new
演算子で、かつ
intern
メソッドが使われていない場合、返されるのは単一のイミュータブルなインスタンスです。
JVMの文字列定数プール
.
を参照してください。 JavaTechniques "文字列の等価性と内部処理" をご覧ください。
関連
-
SocketTimeoutExceptionです。読み込みがタイムアウトしました
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] JavaでArrayListではなくLinkedListを使用するのはいつですか?
-
[解決済み] serialVersionUIDとは何ですか、またなぜそれを使用する必要がありますか?
-
[解決済み] JavaScriptで二重引用符と単一引用符はいつ使うべきですか?
-
[解決済み] どうすれば、文字列中のリテラルな中抜き文字を印刷し、また.formatを使用することができるのでしょうか?
-
[解決済み] 整数の平方根が整数であるかどうかを判断する最速の方法
-
[解決済み] Eclipseにプロジェクトをインポートした後に「Must Override a Superclass Method」エラーが発生する。
-
[解決済み] C#で文字を繰り返し表示する最適な方法
-
[解決済み] 文字列を別の文字列で分割する(C#)
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
エラー java.util.NoSuchElementException
-
Java のエラーです。未解決のコンパイル問題 解決方法
-
この行に複数のマーカーがある - HttpServletResponseが型エラーに解決できない
-
をインスタンス化することができません。
-
スキャナは、タイプに解決することはできません最もルーキー初心者の質問
-
javaコンパイル時のエラー:不正な文字 '\ufeff' に対する解決策です。
-
が 'X-Frame-Options' を 'deny' に設定しているため、フレーム内にある。
-
javaでクラスを作成すると、enclosing classでないように見える
-
org.glassfish.jersey.servlet.ServletContainer
-
SocketTimeoutExceptionの解決方法です。読み込みがタイムアウトした