您的位置:首页 >Java 中 String.getBytes() 返回不同结果的原因解析
发布于2026-04-29 阅读(0)
扫一扫,手机访问

String.getBytes() 每次调用返回的是新创建的 byte[] 实例,其 toString() 默认输出为内存地址标识(如 [B@1b6d3586),因此看似“不同”;但数组内容完全一致,差异仅源于对象引用不同。
在 Ja va 开发中,你是否遇到过这样的场景:对同一个字符串连续调用 `getBytes()`,打印出来的结果却不一样?这看起来像是编码出了错,但实际上,这背后是一个关于 Ja va 对象模型的经典理解题。
简单来说,`String.getBytes()` 方法的作用,是将字符串按照默认字符集(通常是平台相关的 `Charset.defaultCharset()`,比如 UTF-8 或 GBK)编码成字节数组。关键在于,这个方法每次都会返回一个全新的 byte[] 对象。这意味着,即便对同一个字符串调用两次,你拿到手的也是两个内容一模一样,但“身份”完全不同的数组对象。
来看一段典型的代码:
String key = "12345testabcd"; System.out.println(key.getBytes()); // 输出类似:[B@1b6d3586 System.out.println(key.getBytes()); // 输出类似:[B@2c7b84de
表面上看,`[B@1b6d3586` 和 `[B@2c7b84de` 截然不同。但真相是,这只是 `byte[].toString()` 方法在“捣鬼”。数组的 `toString()` 方法继承自 `Object` 类,其默认格式是“类名 + @ + 哈希码的十六进制表示”。这里的哈希码通常基于对象的内存地址生成。每个新数组对象都有自己独一无二的内存地址,因此哈希码自然不同——这仅仅标识了对象的“身份”差异,与数组内部的字节内容毫无关系。
那么,如何正确地验证字节内容是否一致呢?诀窍在于使用正确的工具。
立即学习“Ja va免费学习笔记(深入)”;
import ja va.util.Arrays;
public class MainTest {
public static void main(String[] args) {
String key = "12345testabcd";
byte[] bytes1 = key.getBytes();
byte[] bytes2 = key.getBytes();
System.out.println("Array 1: " + Arrays.toString(bytes1));
System.out.println("Array 2: " + Arrays.toString(bytes2));
System.out.println("Content equal? " + Arrays.equals(bytes1, bytes2)); // true
}
}
使用 `Arrays.toString()` 可以直观地看到数组内容,而 `Arrays.equals()` 才是判断两个数组内容是否相等的“标准答案”。
✅ 几个重要的实践要点:
总结一下,`getBytes()` 方法输出“不同”,这其实是一种视觉上的假象,根源在于 Ja va 中对象引用与对象内容的区分。深刻理解这一点,就能轻松避开这个常见的认知陷阱,写出更稳健的代码。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
7
9