Java String(byte[], int, int)构造方法Javadoc加粗内容含义解析
public String(byte[] bytes, int offset, int length)的文档注释解析 先看这个构造方法的定义:
public String(byte[] bytes, int offset, int length)
对应的官方文档注释是:
使用平台默认字符集对指定字节子数组进行解码,构造一个新的String。
新String的长度由字符集决定,因此可能不等于该子数组的长度。
当给定字节在默认字符集中无效时,此构造方法的行为未指定。若需要对解码过程进行更多控制,应使用CharsetDecoder类。
接下来我来拆解两个加粗部分的具体含义:
第一句加粗内容的含义:
不同字符集里,单个字符对应的字节数差异很大。比如ASCII字符集里,每个字符只占1个字节,这时候用n个字节的子数组解码,得到的String长度就是n;但如果是UTF-8字符集,一个中文汉字通常占3个字节,那3个字节的子数组解码后得到的String长度就是1。还有像UTF-16,每个字符占2个或者4个字节。所以最终生成的String的字符数量(调用length()方法得到的数值),完全取决于当前使用的字符集编码规则,和传入的字节子数组长度(构造方法里的length参数)没有必然的相等关系。第二句加粗内容的含义:
如果你传入的字节序列不符合当前平台默认字符集的编码规范——比如给UTF-8字符集传入了一段截断的多字节编码序列,这个构造方法的处理逻辑是不固定的:有的JDK版本可能直接抛出异常,有的可能把无效字节替换成占位符(比如那个常见的乱码符号�),还有的可能直接跳过无效字节。这种没有统一标准的处理方式就叫“行为未指定”。
要是你需要精准控制解码时的错误处理逻辑——比如要求遇到无效字节就抛出异常,或者用指定字符替换,或者直接忽略错误字节,那就得用CharsetDecoder类,它允许你通过onMalformedInput()等方法设置明确的错误处理策略,完全掌控解码过程。
内容的提问来源于stack exchange,提问作者im o

