Java 中 String.getBytes() 返回不同结果的原因解析
Ja va 中 String.getBytes() 返回不同结果的原因解析

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
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(StandardCharsets.UTF_8)`。
- 不要依赖 `toString()`:永远记住,数组的 `toString()` 输出不是其内容的表示,不能用来判断数据是否相同。
- 关注逻辑内容:在序列化、网络传输或加密等关键场景中,核心是字节数组的逻辑内容,而非承载它的那个对象引用本身。
总结一下,`getBytes()` 方法输出“不同”,这其实是一种视觉上的假象,根源在于 Ja va 中对象引用与对象内容的区分。深刻理解这一点,就能轻松避开这个常见的认知陷阱,写出更稳健的代码。
游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。
同类文章
SpringBoot2.7.x将logback升级到1.3.x以上版本的全过程解析
SpringBoot2 7 x将logback升级到1 3 x以上版本的全过程解析 不少开发者在尝试将SpringBoot 2 7 x项目中的Logback升级到1 3 x或更高版本时,都会遇到一个典型的启动报错。这背后的原因其实很明确:SpringBoot 2 7 x默认依赖的是logback-c
Xrender支持哪些图形格式
xrender支持的图形格式 核心说明 首先得澄清一个常见的误解:xrender本身并不是一个图像解码库。它实际上是X Window System的一个渲染扩展,主要负责提供抗锯齿、路径绘制、渐变、合成这些高级的2D渲染能力。那么,图片是怎么显示出来的呢?通常,应用程序会先用其他专门的库(比如处理P
ubuntu中copendir命令如何与其他命令组合使用
在Ubuntu中组合使用文件复制命令 在Ubuntu系统中,你可能听说过copiodir这个命令,但事实上它并不存在。你真正需要掌握的是功能强大且无处不在的cp命令,它是Linux系统中文件和目录复制的核心工具。那么,如何让cp命令与其他命令协同工作,实现更高效的自动化文件管理呢?关键在于灵活运用管
怎样用nginx日志解决跨域问题
如何通过Nginx配置解决跨域问题:从原理到实战 开门见山地说,试图直接利用Nginx日志来解决跨域问题,这个思路本身存在误区。Nginx日志的核心作用是什么?它本质上是一个“记录系统”,负责详尽记录每一次访问详情与错误信息,但其本身并不具备主动配置或修复跨域问题的能力。跨域问题的根源在于浏览器的同
Debian系统phpstorm的内存设置
Debian 下 PhpStorm 内存设置指南 想让 PhpStorm 在 Debian 上跑得更快更稳?内存配置是关键一步。下面这份指南,将帮你从修改核心参数到验证生效,一步步搞定。 一 修改 vmoptions 文件 动手之前,记得先关闭正在运行的 PhpStorm。接下来,打开终端,找到并编
- 日榜
- 周榜
- 月榜
1
2
3
4
5
6
7
8
9
10
相关攻略
2015-03-10 11:25
2015-03-10 11:05
2021-08-04 13:30
2015-03-10 11:22
2015-03-10 12:39
2022-05-16 18:57
2025-05-23 13:43
2025-05-23 14:01
热门教程
- 游戏攻略
- 安卓教程
- 苹果教程
- 电脑教程
热门话题

