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