Java-Byte[]和String之间的转换问题
Java语⾔中将字符串和字节数组之间相互转换的场景很多,⽐如我们常见的,socketChannel,netty,RocketMQ这类的应⽤在数据传输过程中都需要将字串转换为Byte数组,然后再将Byte数据转换为String。⽐如RSA,DES之类的加解密场景,也是需要对转换为Byte 数据后进⾏。本⽂总结了Byte[]和String之间的转换原理以及实现。
⾸先来⼀段代码作为引⼊:
public static void main(String[] args) {
System.out.println("println 0:"+new String("test".getBytes()));
System.out.println("println 1:"+String.valueOf("test".getBytes()));
System.out.println("println 2"+String.valueOf("test".getBytes().toString()));
}
输出结果:
println 0:test
println 1:[B@6d06d69c
println 2:[B@7852e922
输出结果⼤家还是很有意思的,整体来说因为"println 0"输出的是"test"的字符串;"println 1"输出的是Byte[]数组的Object的toString值;"println 1"输出的是"String"的toString值。之所以会出现这么有趣的结果,跟Byte转换为String的⼏个关键函数有关。这部分的源码实现很简洁,我们先来看⼀下。
String(String original)
String(char value[])
String(char value[], int offset, int count)
String(int[] codePoints, int offset, int count)
String(byte bytes[], int offset, int length, String charsetName)
String(byte bytes[], int offset, int length, Charset charset)
String(byte bytes[], String charsetName)
java valueofString(byte bytes[], Charset charset)
String(byte bytes[], int offset, int length)
String(byte bytes[])
String(StringBuffer buffer)
String(StringBuilder builder)
String(char[] value, boolean share)
通过String的构造⽅法可以看出String主要关注点就是处理,String,char[],byte[]这三个类型。
2.String.valueOf()
String valueOf(Object obj)
String valueOf(char data[])
String valueOf(char data[], int offset, int count)
String valueOf(boolean b)
String valueOf(char c)
String valueOf(int i)
String valueOf(long l)
String valueOf(float f)
String valueOf(double d)
String.valueOf在接收参数后会先调⽤参数的toString⽅法,然后调⽤newString⽅法⽣产⼀个字符串。  因为String提供了valueOf 转义,但是没有提供针对byte []的转义,所以当String.valueOf(Byte[])时参数是被视为object进⾏处理。这就引出了我们的第三个关键⽅法,Object 的toString是怎么实现的问题。
public static String valueOf(Object obj) {
return (obj == null) ? "null" : String();
}
//Object的的toString⽅法
public String toString() {
return getClass().getName() + "@" + HexString(hashCode());
}
因为Object的toString⽅法,默认返回类名称+@+散列码⼗六进制,这个很显然不是我们预期的结果。
总结
String和Byte之间的转换是个很有趣的问题,通过⼀系列看起来很有条理的⽅法,最终的结果却与我们预期的结果⼤相径庭。其中所涉及的问题确实最能反映设计者考虑问题的思路的。⽐如虽然通过⼀系列的源码解读我们梳理出来String和Byte专业的原理和实现,可是另⼀个问题我却没有理解:为什么String.valueOf没有正对Byte数组的实现⽅法(备注⼀下:以后有时间需要好好查查)。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。