string.copyvalueof()不支持substring式截取,其重载方法copyvalueof(char[], int offset, int count)中offset为起始索引、count为复制长度(非结束索引),需满足offset≥0、count≥0且offset+count≤数组长度,否则抛arrayindexoutofboundsexception。

String.copyValueOf() 不能直接截取子串,它只复制整个数组或指定长度
很多人看到 copyValueOf 就以为能像 substring 那样从某个 offset 开始切,其实不是。String.copyValueOf(char[]) 和 String.copyValueOf(char[], int, int) 中的后两个参数是「起始索引」和「长度」,不是「起始 + 结束」。也就是说,它不支持类似 Python 的 [start:end] 语义。
常见错误现象:String.copyValueOf(chars, 3, 5) 想取下标 3 到 7 的字符,结果却抛 IndexOutOfBoundsException —— 因为第三个参数是「要复制多少个字符」,不是「结束下标」。
- 正确理解:第二个参数是起始位置(
offset),第三个是复制长度(count) - 必须满足:
offset >= 0 && count >= 0 && offset + count - 如果只传一个数组参数,等价于
copyValueOf(chars, 0, chars.length)
想从中间开始截取?必须用三参数重载 + 手动算长度
比如你有一个 char[] data = {'a','b','c','d','e','f'},想取 "de"(即下标 3~4),就得明确告诉 JVM:从下标 3 开始,取 2 个字符。
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
char[] data = {'a','b','c','d','e','f'};
String s = String.copyValueOf(data, 3, 2); // → "de"
注意这里不是 copyValueOf(data, 3, 4)(那会尝试取 4 个字符,越界);也不是 copyValueOf(data, 3, 5)(那是从 3 开始取到下标 7,但数组只有 6 个元素)。
- 若已知起始下标
start和结束下标end(左闭右开),长度应为end - start - 务必先校验:
if (start >= 0 && end - 别和
Arrays.copyOfRange(char[], from, to)混淆——后者返回的是新char[],不是String
和 new String(char[], int, int) 对比:行为一致,但语义更清晰
String.copyValueOf(char[], int, int) 和 new String(char[], int, int) 底层调用的是同一段逻辑,都通过 StringUTF16.newString 或类似路径构造字符串。区别在于前者是静态工厂方法,语义上强调「值拷贝」,后者是构造器调用,容易让人误以为会共享底层数组(其实不会,Java 9+ 字符串内部用 byte[],且始终复制)。
- 推荐优先用
copyValueOf:意图更明确,且避免无参构造器被误用 - 两者性能无差异,都是 O(n) 时间复制字符
- 如果字符数组可能被外部修改,用这两个方法都安全——它们不保留对原数组的引用(Java 7u6+ 后所有字符串构造均深拷贝)
真正容易被忽略的坑:空数组、null 和编码无关性
copyValueOf 不涉及编码转换,它只是把 char 值按 UTF-16 顺序拼成字符串。但以下边界情况常被跳过:
- 传
null数组会直接抛NullPointerException,不会静默处理 - 空数组
new char[0]是合法的,copyValueOf(new char[0])返回空字符串"" - 当
count == 0(如copyValueOf(data, 5, 0)),也返回"",哪怕offset超出范围?不,此时仍会检查offset + 0 ,所以 <code>offset > array.length依然报错 - 没有「从末尾往前取」的语法,负数 offset 或 count 直接抛
IllegalArgumentException
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










