应根据是否需要截取字符数组区间来选择:全量转换用单参数版,指定范围用三参数版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
<h3>和 new String(char[], int, int) 的行为差异</h3>
<p>这两个 API 表面功能一样,但底层有区别:<code>String.copyValueOf()</code> 内部会先检查参数,再调用 <code>new String(char[], int, int)</code>;而后者是构造器,不额外校验(JDK 9+ 后两者底层已统一,但语义上仍建议优先用 <code>copyValueOf</code>,因为名字更表意)。</p>
<p>性能上无差别,但要注意:它们都创建新字符串对象,且内容是原数组区间的**拷贝**,后续修改原数组不会影响该字符串。如果你误以为是共享引用,后期调试会很困惑。</p>
<h3>空数组、零长度区间这些边缘情况怎么处理</h3>
<p>传入空数组 <code>new char[0]</code> 是合法的,只要 <code>offset == 0 && count == 0</code>,就能返回空字符串 <code>""</code>。但若 <code>count == 0</code> 且 <code>offset</code> 在有效范围内(比如数组长 5,<code>offset=3, count=0</code>),也返回 <code>""</code>——这没问题,是设计行为,不是 bug。</p>
<p>容易忽略的是:当 <code>count == 0</code> 时,<code>offset</code> 可以等于数组长度(即指向“末尾之后”),此时仍合法。例如:<code>char[] a = {'a','b'};</code>,<code>String.copyValueOf(a, 2, 0)</code> 是允许的,返回 <code>""</code>。但 <code>String.copyValueOf(a, 3, 0)</code> 就越界了——因为 <code>offset</code> 本身超了。</p>










