stringbuilder.append(char[])直接追加字符数组内容,不会输出[c@xxx;出现该现象是误调用了append(object)或对数组调用了tostring()。

Java 中 StringBuilder.append(char[]) 默认会将整个字符数组追加到字符串中,而不是把数组对象的内存地址(如 [C@12345678)转成字符串。你遇到“转为对象地址”的情况,**不是 append(char[]) 的行为,而是误用了 append(Object) 重载方法**,比如传入了 char[].class、或对数组做了不恰当的类型转换(如强制转成 Object),又或者错误调用了 toString() 以外的其他方法。
确认你用的是正确的 append 方法
StringBuilder 提供了专门针对 char[] 的重载方法:public StringBuilder append(char[] str)
这个方法会逐个复制数组中的字符,不会调用 toString(),更不会输出类似 [C@xxx 的哈希值。
只要直接传入原始 char 数组变量,就不会出问题:
char[] data = {'h', 'e', 'l', 'l', 'o'};
StringBuilder sb = new StringBuilder();
sb.append(data); // ✅ 正确:输出 "hello"
常见导致输出 [C@xxx 的错误写法
- 误传
data.toString()——char[].toString()默认返回类名+哈希码,应避免 - 显式转型为
Object:如sb.append((Object)data),这会触发append(Object)方法,进而调用String.valueOf(obj),而String.valueOf(char[])其实是安全的;但若传的是其他数组类型(如int[])或非 char 数组,则可能出问题 - 混淆了
char[]和String:例如先用new String(charArray)再 append,虽可行但多一次对象创建,没必要
安全高效的替代写法(按需选择)
- 直接
append(char[])—— 最推荐,零开销,语义清晰 - 指定范围:
append(char[] str, int offset, int len)—— 适合只追加子数组 - 如果已有
String,就用append(String);但别为了“转 String”而对 char 数组调用new String(arr),除非你需要不可变副本或编码处理
验证是否真有问题的小技巧
打印前可快速检查类型:
char[] arr = {'a', 'b'};
System.out.println(arr.getClass()); // 输出 class [C(表示 char 数组)
System.out.println(sb.append(arr).toString()); // 应输出 "ab"
如果看到 [C@... 出现在最终字符串里,说明某处代码把数组当普通对象 toString 了,回溯调用栈,重点查 append(...) 前是否有 .toString() 或错误转型。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











