我很难理解 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[] 构造函数的文档指出,“新字符串的长度是字符集的函数,因此可能不等于字节数组的长度。” 确实如此,在 US-ASCII 字符集中,字符串“abc”的长度是 3,而不是 32。
奇怪的是,即使 abc2 不包含空格字符,abc2.trim() 返回相同的字符串,但长度调整为正确的值 3 并且 abc1.equals(abc2) 返回 true...我错过了一些明显的东西吗?
是的,我意识到我可以将显式长度传递给构造函数,我只是想了解默认语义。