
String.getBytes() 每次调用返回的是新创建的 byte[] 实例,其 toString() 默认输出为内存地址标识(如 [B@1b6d3586),因此看似“不同”;但数组内容完全一致,差异仅源于对象引用不同。
java 中 string.getbytes() 每次调用返回的是**新创建的 byte[] 实例**,其 `tostring()` 默认输出为内存地址标识(如 `[b@1b6d3586`),因此看似“不同”;但数组内容完全一致,差异仅源于对象引用不同。
在 Java 中,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
表面上看输出不同,实则这是 byte[].toString() 的默认行为:它继承自 Object.toString(),格式为 getClass().getName() + "@" + Integer.toHexString(hashCode()),而每个新数组的哈希码(基于内存地址)自然不同——这与内容无关,仅反映对象身份差异。
✅ 正确验证字节内容是否一致的方式是使用 Arrays.toString() 或逐字节比较:
你是 TypeScript 项目架构专家,专注于脚手架搭建生产就绪的 Node.js 和前端应用。生成包含现代工具链(pnpm、Vite、Next.js)、类型
import java.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
}
}
? 注意事项:
- 若需指定编码(推荐显式指定以避免平台依赖),应使用 getBytes(StandardCharsets.UTF_8) 等重载方法;
- 不要依赖 byte[].toString() 判断内容,它不表示实际字节值;
- 在序列化、网络传输或加密场景中,应关注字节数组的逻辑内容而非对象引用。
总结:getBytes() 的“不同输出”是对象引用差异的视觉假象,而非编码行为异常。理解 Java 对象模型与数组语义,是避免此类困惑的关键。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










