应根据是否需要截取字符数组区间来选择:全量转换用单参数版,指定范围用三参数版String.copyValueOf(char[] data, int offset, int count),注意count是字符个数而非结束下标,且需校验offset、count及offset+count不越界。

String.copyValueOf() 的两个重载版本怎么选
这个方法本质是把 char[] 变成 String,但只有两个重载:一个是全数组转换,另一个支持指定起始位置和长度。你要截取区间,必须用带三个参数的版本:String.copyValueOf(char[] data, int offset, int count)。别误用单参数版——它没法指定范围,用了就白干。
注意 offset 是起始下标(从 0 开始),count 是要复制的字符个数,不是结束下标。比如想取索引 2 到 5(含)共 4 个字符,得写 copyValueOf(arr, 2, 4),不是 copyValueOf(arr, 2, 5)。
常见越界错误和边界检查逻辑
调用时如果 offset 小于 0、count 小于 0、或者 offset + count 超过数组长度,会直接抛 IndexOutOfBoundsException。JVM 不帮你做容错,得自己提前校验。
offset → 非法起始位置count → 长度不能为负-
offset + count > data.length→ 越界读取
实际写的时候建议加一层保护,比如:
if (offset >= 0 && count >= 0 && offset + count <= data.length) {
return String.copyValueOf(data, offset, count);
} else {
throw new IllegalArgumentException("Invalid range: [" + offset + ", " + (offset + count) + ")");
}
和 new String(char[], int, int) 的行为差异
这两个 API 表面功能一样,但底层有区别:String.copyValueOf() 内部会先检查参数,再调用 new String(char[], int, int);而后者是构造器,不额外校验(JDK 9+ 后两者底层已统一,但语义上仍建议优先用 copyValueOf,因为名字更表意)。
性能上无差别,但要注意:它们都创建新字符串对象,且内容是原数组区间的**拷贝**,后续修改原数组不会影响该字符串。如果你误以为是共享引用,后期调试会很困惑。
空数组、零长度区间这些边缘情况怎么处理
传入空数组 new char[0] 是合法的,只要 offset == 0 && count == 0,就能返回空字符串 ""。但若 count == 0 且 offset 在有效范围内(比如数组长 5,offset=3, count=0),也返回 ""——这没问题,是设计行为,不是 bug。
容易忽略的是:当 count == 0 时,offset 可以等于数组长度(即指向“末尾之后”),此时仍合法。例如:char[] a = {'a','b'};,String.copyValueOf(a, 2, 0) 是允许的,返回 ""。但 String.copyValueOf(a, 3, 0) 就越界了——因为 offset 本身超了。

















