私はこのレガシーコードの行に出くわしました。
String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"));
私が理解できる限りでは、同じcharSetを使用したエンコードとデコードです。
これは以下とどのように違いますか?
String newString = oldString;
2つの行の出力が異なるシナリオはありますか?
p.s .:明確にするために、はい、私は Joel Spolskyによるエンコードに関する優れた記事 !
これは複雑な方法です
String newString = new String(oldString);
これにより、使用される基本的なchar []がはるかに長くなるため、文字列が短くなります。
ただし、より具体的には、すべての文字がUTF-8でエンコードできることを確認します。
文字列にはエンコードできない「文字」がいくつかあり、これらは?
に変換されます
\ uD800と\ uDFFFの間の文字はエンコードできず、「?」に変換されます
String oldString = "\uD800";
String newString = new String(oldString.getBytes("UTF-8"), "UTF-8");
System.out.println(newString.equals(oldString));
プリント
false
これは以下とどのように違いますか?
コードのこの行:
String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"));
次のコード行では、新しいStringオブジェクト(つまりoldString
のコピー)を構築します:
String newString = oldString;
型Java.lang.String
の新しい変数を宣言し、変数oldString
と同じStringオブジェクトを参照するように初期化します。
2つの行の出力が異なるシナリオはありますか?
絶対に:
String newString = oldString;
boolean isSameInstance = newString == oldString; // isSameInstance == true
vs.
String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"));
// isSameInstance == false (in most cases)
boolean isSameInstance = newString == oldString;
a_horse_with_no_name(コメントを参照)は当然です。と同等
String newString = new String(oldString.getBytes("UTF-8"), "UTF-8"));
は
String newString = new String(oldString);
ピーター・ローリーが答えで説明しているエンコーディングに対する微妙な違いを差し引いたもの。