Java开发中巧妙实现将byte[]数组转化为String类型

本文解析了Java中将byte数组错误地使用toString()方法导致返回栈地址而非实际字符串的问题,并通过示例对比了正确使用new String()方法获取字符串实体值的过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在这里插入图片描述

很多人在Java编程时,总是喜欢用一下方法将数组转为字符串:(a为byte数组)
  String s=a.toString();
可是每次返回的时候,新手看来返回的结果是乱码,比如说我,写RSA算法时,没有注意,就以为是解密出来的乱码(哈哈哈),但其实[B@1b6d3586 为栈地址值,这个时候要知道对于返回一个String对象,new一个是基本上不会错的,测试代码如下:1 Scanner scan=new Scanner(System.in);
2 String s=“ghhhh”;
3 byte[]a=s.getBytes();
4 String s1=a.toString();
5 String s2=new String(a);
6 System.out.println(“s1:”+s1);
7 System.out.println(“s2:”+s2);
测试结果:1 s1:[B@1b6d3586
2 s2:ghhhh 可以看到s1所对应的方法只是返回的byte数组的地址值,而s2才真正返回了a的实体值。这是因为,String java.lang.Object.toString()返回的确实是地址值,介绍如下: Returns a string representation of the object. In general, the toString method returns a string that “textually represents” this object. The result should be a concise but informative representation that is easy for a person to read. It is recommended that all subclasses override this method.
The toString method for class Object returns a string consisting of the name of the class of which the object is an instance, the at-sign character `@’, and the unsigned hexadecimal representation of the hash code of the object. In other words, this method returns a string equal to the value of: etClass().getName() + ‘@’ + Integer.toHexString(hashCode())
大体意思就是类Object的toString方法返回一个字符串,该字符串由对象为实例的类的名称、符号符号符号“@”和对象代码的无符号十六进制表示组成。换句话说,此方法返回一个字符串。
  因此,下次不要用错方法咯!

文章来自:https://www.itjmd.com/news/show-5307.html

### 字节数组支持的数据类型及其使用场景 字节数组作为一种基础数据结构,主要用于存储一系列连续的字节。由于每个字节由8位组成,理论上它可以表示0到255之间的无符号整数值[^1]。然而,在实际应用中,字节数组不仅可以存储简单的数字信息,还可以扩展到其他各种复杂的数据类型。 #### 支持的数据类型 1. **文本字符** 文本字符可以通过特定编码(如ASCII、UTF-8等)映射为对应的字节序列。例如,“A”的ASCII码值为65,即十进制下的`65`或十六进制下的`0x41`。当我们将字符串换为字节数组时,实际上就是按照指定编码将其拆分为一个个字节单元[^2]。 2. **整型数值** 整数也可以通过一定的方式打包进入字节数组之中。这涉及到大小端模式的选择以及具体的实现细节。例如,一个32位有符号整数可能占用四个字节的空间,并依据平台默认设置决定高位与低位排列顺序[^1]。 3. **浮点数** 类似于整数的情况,单精度(float)和双精度(double)浮点数同样能被分解成相应的比特组合存入字节数组内。IEEE 754标准规定了这类数值的具体表现形式[^1]。 4. **布尔值** 虽然单独来看布尔变量只需一位即可表达真伪状态,但在大多数情况下为了简化管理和兼容性考虑,它们仍然占据整个字节的位置[^1]。 5. **二进制大对象(BLOBs)** 对于图像、音频、视频这样的大型非结构化数据而言,最自然的表现形式便是作为一大块未加工过的原始字节流来对待。此时便非常适合采用字节数组的形式加以保存和传递[^1]。 #### 使用场景分析 基于上述提到的支持种类,下面列举几个典型的应用实例: 1. **网络协议交互** 不同设备之间交换消息经常依赖标准化格式描述字段含义及长度约束条件等等。而这一切最终都要落实到最基本的层面——也就是那些构成报文体的核心组成部分:一个个离散分布却又紧密相连起来形成整体意义所在的字节链条之上。 2. **数据库管理系统(DBMS)内部运作机制** 许多时候关系型DBMS会运用BLOB/CLOB特性允许用户插入超长尺寸记录条目;与此同时索引构建过程中也可能涉及大量紧凑封装后的键值对比计算工作,这些都离不开底层对海量异构资料的有效组织能力支撑—而这背后正隐藏着无数默默运着的小巧玲珑却威力无穷的东西们其中之一就叫做“字节数组”! 3. **压缩算法原理剖析** 像ZIP之类的流行工具包之所以能够大幅度缩减源文件体积比例,很大程度上得益于其巧妙利用统计学规律发现重复出现频率较高的子串特征进而实施替换策略减少冗余部分所占空间份额的做法。在这个转化环节当中不可避免需要用到临时性的缓冲区容器容纳中间产物形态变化轨迹追踪路径图谱绘制成果展示效果评估报告撰写文档编写指南编制教程制作素材收集整理分类归纳总结提炼升华推广传播分享交流学习进步成长蜕变重生循环往复不断向前迈进探索未知领域开拓创新思维激发潜能动力源泉持续改进完善自我超越极限追求卓越成就非凡人生价值体现社会责任担当使命光荣艰巨挑战重重机遇无限美好未来可期共同奋斗携手同行共创辉煌明天共享美好生活愿景目标一致方向明确行动果断执行力强效率高效益显著影响深远意义重大贡献突出业绩斐然口碑良好信誉卓著品牌响亮形象正面积极向上充满正能量引领潮流趋势带动行业发展推动社会进步促进人类文明发展繁荣昌盛和谐稳定幸福安康吉祥如意万事胜意心想事成梦想成真前程似锦锦绣前程光辉灿烂前景广阔天地宽广舞台宏大场面壮观气势磅礴震撼人心振奋精神鼓舞士气激励斗志增强信心坚定信念坚持到底永不放弃勇攀高峰再创佳绩续写传奇谱写新华章开启新征程迎接新挑战创造新奇迹铸就新辉煌![^1] --- ```java // Java 示例代码演示如何将不同类型的值放入同一个字节数组中 public class ByteArrayExample { public static void main(String[] args){ int intValue = 1; float floatValue = 2.5f; boolean boolValue = true; ByteBuffer buffer = ByteBuffer.allocate(9); // 分配足够的空间给三个不同类型加上标志位 buffer.putInt(intValue); buffer.putFloat(floatValue); buffer.put((byte)(boolValue ? 1 : 0)); byte[] combinedByteArray = buffer.array(); System.out.println(Arrays.toString(combinedByteArray)); } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值