Javaで「new String(...)」という表現は何のためにあるのでしょうか?
質問
オンラインのコードサンプルを見ていると、new 演算子を用いて String 定数を String オブジェクトに代入しているのを見かけることがあります。
たとえば
String s;
...
s = new String("Hello World");
これは、もちろん、比較すると
s = "Hello World";
私はこの構文に精通していないので、目的または効果が何であるか全くわかりません。 String 定数は通常、定数プールに格納され、その後、JVM が String 定数を処理するために持っている任意の表現に格納されるので、何かがヒープ上に割り当てられることさえあるでしょうか?
どのように解決するのですか?
あなたが
を考える
と思っているところです。
new String(String)
のように、内部の文字配列の別個のコピーを強制することです。
small=new String(huge.substring(10,20))
しかし、この動作は残念ながら文書化されておらず、実装に依存しています。
私は、大きなファイル (いくつかは最大 20 MiB) を文字列に読み込んで、事後的にそれを行に切り分けたときに、これによって火傷を負いました。 私は、ファイル全体からなる char[] を参照する行のすべての文字列を終了しました。 残念ながら、これでは意図せず、ファイルを処理するよりも長い時間、私が保持するいくつかの行のために配列全体への参照を保持することになります - 私は強制的に
new String()
を使用して回避することを余儀なくされました。2 万個のファイルを非常に迅速に処理すると膨大な量の RAM が消費されるためです。
実装に依存しない唯一の方法は
small=new String(huge.substring(10,20).toCharArray());
これは残念ながら、配列を2回コピーする必要があります。
toCharArray()
に対して一度、そして String コンストラクタで一度です。
既存の文字列をコピーして新しい文字列を取得する方法を文書化する必要があります。
String(String)
のドキュメントをより明確にするために改善する必要があります(そこに含意はありますが、かなり曖昧で解釈の余地があります)。
ドキュメントに記載されていないことを仮定してしまうという落とし穴
続々と寄せられるコメントに応えて、Apache Harmony の実装である
new String()
がどうだったかを観察してください。
public String(String string) {
value = string.value;
offset = string.offset;
count = string.count;
}
その通り、基礎となる配列のコピーはありません。 それでも、(Java 7の)Stringのドキュメントに準拠しているということです。
新しく作成されたStringオブジェクトを初期化し、引数と同じ文字列を表します。オリジナルの明示的なコピーが必要でない限り、Stringは不変なので、このコンストラクタの使用は不要です。
重要なのは、"引数のコピーであることです。 文字列 引数文字列とその文字列をサポートする基礎となる文字配列のコピー"とは書いてありません。
にプログラムすることに注意してください。 ドキュメント でなく 一つ 実装 .
関連
-
NullPointerException - java.lang.
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] Javaにおけるpublic、protected、package-private、privateの違いは何ですか?
-
[解決済み] JavaでStringをintに変換するにはどうしたらいいですか?
-
[解決済み] 文字列の単語を反復処理するにはどうすればよいですか?
-
[解決済み] Javaで文字列値からenum値を取得する方法
-
[解決済み] Javaで文字列を分割する方法
-
[解決済み] ファイルの内容からJavaの文字列を作成するにはどうすればよいですか?
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
実行中にEclipseがポップアップする A Java Exception has occurred
-
ブートレイヤーの初期化中にエラーが発生しました java.lang.module.FindException: モジュールが見つかりません
-
Git Pull Failed マージされていないファイルがあるため、Pull できません。
-
JAVA_HOME環境変数が正しく定義されていない問題を解決する
-
名前 'XXX' を持つ Bean の作成に失敗しました。自動依存関係の注入に失敗しました 解決方法
-
java.sql.SQLException: 結果セットの開始前
-
CertificateException: XXXに一致するサブジェクトの代替DNS名が見つかりません 解決策
-
Javaがリソースリークに遭遇した:'input'が閉じない 解決方法
-
eclipse 実行 Java、エラー: 選択を起動できず、レシーバーもありません。
-
switch case文のcaseの後の列挙定数は列挙型なし