首页 游戏 软件 资讯 排行榜 专题
首页
编程语言
Java 中 String.getBytes() 返回不同结果的原因解析

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

热心网友
19
转载
2026-04-29

Ja va 中 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 中对象引用与对象内容的区分。深刻理解这一点,就能轻松避开这个常见的认知陷阱,写出更稳健的代码。

来源:https://www.php.cn/faq/2391733.html
免责声明: 游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

相关攻略

Java 中 String.getBytes() 返回不同结果的原因解析
编程语言
Java 中 String.getBytes() 返回不同结果的原因解析

Ja va 中 String getBytes() 返回不同结果的原因解析 String getBytes() 每次调用返回的是新创建的 byte[] 实例,其 toString() 默认输出为内存地址标识(如 [B@1b6d3586),因此看似“不同”;但数组内容完全一致,差异仅源于对象引用不同。

热心网友
04.29
如何在 Java 中利用 WeakReference 防止由于缓存对象导致的内存溢出
编程语言
如何在 Java 中利用 WeakReference 防止由于缓存对象导致的内存溢出

如何在 Ja va 中利用 WeakReference 防止由于缓存对象导致的内存溢出 先说一个核心结论:WeakReference 不能直接用于常规缓存,它只适合“可丢弃”的临时引用场景。 很多开发者误以为它能自动管理内存,结果掉进了坑里。 为什么 WeakReference 不适合做通用缓存 道

热心网友
04.29
如何在 Java 中利用 Collectors.collectingAndThen() 在收集完成后将结果转为不可变
编程语言
如何在 Java 中利用 Collectors.collectingAndThen() 在收集完成后将结果转为不可变

如何在 Ja va 中利用 Collectors collectingAndThen() 在收集完成后将结果转为不可变 collectingAndThen() 的核心作用不是“变不可变”,而是“后处理” 首先得澄清一个常见的误解:Collectors collectingAndThen() 本身并不

热心网友
04.29
Java SSL调试日志中如何唯一标识多TLS连接?
编程语言
Java SSL调试日志中如何唯一标识多TLS连接?

Ja va SSL调试日志中如何唯一标识多TLS连接? Ja va SSL调试日志本身不直接标记TLS连接ID,但可通过线程ID(第3字段)与线程名(第4字段)组合,在单次握手生命周期内准确定位归属;需注意线程复用场景下该组合仅反映处理线程而非连接本身。 排查多TLS连接问题时,面对满屏的SSL调试

热心网友
04.29
如何通过 Unsafe 类操作 CPU 的 Memory Barrier 实现在 Java 层的无锁屏障设计
编程语言
如何通过 Unsafe 类操作 CPU 的 Memory Barrier 实现在 Java 层的无锁屏障设计

如何通过 Unsafe 类操作 CPU 的 Memory Barrier 实现在 Ja va 层的无锁屏障设计 先说一个核心事实:Ja va 层无法直接通过 Unsafe 发出 CPU 级 Memory Barrier 指令。 我们常用的 loadFence()、storeFence()、fullF

热心网友
04.29

最新APP

宝宝过生日
宝宝过生日
应用辅助 04-07
台球世界
台球世界
体育竞技 04-07
解绳子
解绳子
休闲益智 04-07
骑兵冲突
骑兵冲突
棋牌策略 04-07
三国真龙传
三国真龙传
角色扮演 04-07

热门推荐

《识质存在》中后期BD构筑攻略-中后期配装与战斗策略解析
游戏攻略
《识质存在》中后期BD构筑攻略-中后期配装与战斗策略解析

《识质存在》中后期配装与打法全解析:从生存到精通 进入《识质存在》的中后期,战场环境陡然严峻。敌人的伤害与生存压力同步攀升,单纯的武器升级已不足以应对挑战。真正的战力构建,是一个系统工程,它涵盖了武器、道具、模块天赋与侵入节点的协同搭配。如果你正为如何配装而困惑,下面的攻略或许能为你指明方向。 一、

热心网友
04.29
《黑袍纠察队》主演谈阿什莉隐藏的勇敢:“她必须管教这群‘孩子’”
游戏攻略
《黑袍纠察队》主演谈阿什莉隐藏的勇敢:“她必须管教这群‘孩子’”

《黑袍纠察队》主演揭秘阿什莉隐藏的勇敢!她如何从傀儡CEO到副总统,注射五号化合物长出第二张脸,在祖国人阴影下求生。第五季剧情解析,点击查看! 在埃里克·克里普克打造的《黑袍纠察队》宇宙里,科尔比·米尼菲饰演的阿什莉·巴雷特,绝对算得上最让人过目不忘的角色之一。尽管她在沃特国际的企业和整治阶梯上步步

热心网友
04.29
一路向西斩妖除魔 《遥遥西土》Steam好评如潮
游戏攻略
一路向西斩妖除魔 《遥遥西土》Steam好评如潮

一路向西斩妖除魔 《遥遥西土》Steam好评如潮 最近Steam上杀出了一匹黑马:由法国独立工作室Evil Raptor开发的4人合作射击游戏《遥遥西土(Far Far West)》,一登陆抢先体验就收获了玩家“好评如潮”的顶级评价。看看数据就知道有多夸张:在超过2700条玩家评价中,好评率稳稳站在

热心网友
04.29
Midnight Season 1 中最快、最简单的地牢挑战
游戏攻略
Midnight Season 1 中最快、最简单的地牢挑战

探索Midnight Season 1最快地城排名:S-Tier Collegiate Calamity等攻略,优化刷本效率,提升装备和进度 开门见山地说,在《Midnight》第一赛季里,并非所有地城(Delves)的“性价比”都一样。有的流程紧凑,一路畅通无阻;有的则弯弯绕绕,耗时费力。为了帮你

热心网友
04.29
SpringBoot2.7.x将logback升级到1.3.x以上版本的全过程解析
编程语言
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

热心网友
04.29