arrays.tostring()显示字节数组为十进制数(-128至127)因其按byte有符号整型原始值格式化,如0xff转为-1;需十六进制可用string.format("%02x", b & 0xff)配合stream拼接;utf-8字符串应显式用new string(b, standardcharsets.utf_8)。

直接用 Arrays.toString() 查看字节数组,会显示每个字节的十进制数值(-128 到 127),而不是你可能期待的十六进制或可读字符串形式。这是它最常用也最容易误解的用法。
为什么 Arrays.toString(byte[]) 显示的是数字?
因为 byte 是有符号整数类型,Arrays.toString() 对所有基本类型数组都按其原始值格式化。比如:
byte[] data = { (byte)0xFF, 65, 'B' };
System.out.println(Arrays.toString(data));
输出:[-1, 65, 66] —— 注意 0xFF 被解释为 -1,不是 255。
想看十六进制怎么办?
Java 标准库没提供直接的十六进制 toString 方法,但可以用以下方式快速实现:
- 用
String.format("%02X", b)格式化每个字节(大写十六进制,两位补零) - 用
Arrays.stream()+mapToObj()+Collectors.joining()拼接 - 简单循环拼接(适合调试时快速写)
示例:
byte[] data = { (byte)0xAB, (byte)0xCD, 0x00, 65 };
String hex = Arrays.stream(data)
.mapToObj(b -> String.format("%02X", b & 0xFF))
.collect(Collectors.joining(" "));
System.out.println(hex); // 输出:AB CD 00 41
想看对应字符串(假设是 UTF-8 编码)?
别用 Arrays.toString(),直接构造 String:
-
new String(byteArray, StandardCharsets.UTF_8)—— 推荐,明确指定编码 -
new String(byteArray)—— 不推荐,依赖平台默认编码,易出错
注意:如果字节数组不是合法 UTF-8 序列,会得到替换字符()或异常,需根据实际用途判断是否适用。
调试时更实用的小技巧
开发中常需要同时看清数值、十六进制和可读字符,可以自己封装一个简易打印方法:
public static void printBytes(byte[] b) {
for (int i = 0; i
System.out.printf("%02X ", b[i] & 0xFF);
}
System.out.println();
System.out.println(new String(b, StandardCharsets.UTF_8));
}
这样既看到原始字节(无符号十六进制),又看到解码后的文本,排查编码问题更直观。











