String.copyValueOf(char[] data, int offset, int count)是安全提取字符子区间的正确方法,从offset开始复制count个字符,自动校验offset≥0、count≥0且offset+count≤data.length,越界抛IndexOutOfBoundsException。

String.copyValueOf() 本身不支持直接指定子区间(即不能像 Arrays.copyOfRange() 那样传入起始和结束索引),它只有两个重载方法:
✅ String.copyValueOf(char[] data) —— 复制整个字符数组
✅ String.copyValueOf(char[] data, int offset, int count) —— 这才是安全提取子区间的正确用法
关键:使用三参数版本,明确控制起止范围
该方法从 data[offset] 开始,复制 count 个字符(不是到 count 索引!),内部会自动校验边界,抛出 IndexOutOfBoundsException(而非静默出错或越界读内存),因此是**安全的**。
使用时需确保以下三点:
- offset ≥ 0 且 count ≥ 0
- offset + count ≤ data.length(这是核心安全检查点)
- 若违反任一条件,立刻抛异常,避免静默截断或 JVM 崩溃
正确示例:提取中间 3 个字符
char[] src = {'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd'};String s = String.copyValueOf(src, 6, 3); // 从索引 6 开始取 3 个 → "Wor"
⚠️ 注意:count = 3 表示“取 3 个”,不是“取到索引 3”;offset = 6 对应字符 'W',后续是 'o'、'r'。
常见误用与规避
- ❌ 误用双参数版试图“隐式截取”:没有子区间能力,只能全量复制
- ❌ 手动 new String(char[], int, int) 虽等效,但
copyValueOf语义更清晰(强调“值拷贝”,非构造逻辑) - ❌ 忘记校验
offset + count—— 即使数组非 null,越界仍会抛异常,务必在调用前确认或靠其异常机制兜底
对比其他方式:为什么推荐这个?
- 比
new String(data, offset, count)更具可读性(方法名直述意图) - 比
String.valueOf(Arrays.copyOfRange(...))更省内存(不额外创建临时数组) - 比手动循环拼接或 StringBuilder 更简洁、不可变、线程安全










