Java String(byte[]) コンストラクター (Java 6) のセマンティクスの背後にある理論的根拠を理解するのに苦労しています。結果の String オブジェクトの長さは、通常、間違っています。おそらく、ここにいる誰かが、これが理にかなっている理由を説明できるでしょう。
次の小さな Java プログラムを考えてみましょう。
import java.nio.charset.Charset;
public class Test {
public static void main(String[] args) {
String abc1 = new String("abc");
byte[] bytes = new byte[32];
bytes[0] = 0x61; // 'a'
bytes[1] = 0x62; // 'b'
bytes[2] = 0x63; // 'c'
bytes[3] = 0x00; // NUL
String abc2 = new String(bytes, Charset.forName("US-ASCII"));
System.out.println("abc1: \"" + abc1 + "\" length: " + abc1.length());
System.out.println("abc2: \"" + abc2 + "\" length: " + abc2.length());
System.out.println("\"" + abc1 + "\" " +
(abc1.equals(abc2) ? "==" : "!=") + " \"" + abc2 + "\"");
}
}
このプログラムの出力は次のとおりです。
abc1: "abc" length: 3
abc2: "abc" length: 32
"abc" != "abc"
String byte[] コンストラクターのドキュメントには、「新しい String の長さは文字セットの関数であるため、バイト配列の長さと等しくない場合があります」と記載されています。実際、正確に言えば、US-ASCII 文字セットでは、文字列「abc」の長さは 32 ではなく 3 です。
不思議なことに、abc2 には空白文字が含まれていませんが、abc2.trim() は同じ文字列を返しますが、長さは正しい値 3 に調整され、abc1.equals(abc2) は true を返します...明らかに何か不足していますか?
はい、明示的な長さをコンストラクターに渡すことができることを認識しています。デフォルトのセマンティクスを理解しようとしているだけです。