Java String getBytes非确定性

时间:2014-12-19 23:52:26

标签: java string serialization

我无法弄清楚为什么在String上调用两次getBytes()会返回两个不相等的字节数组():

final String aString = "hello world";
System.out.println(aString.getBytes());
System.out.println(aString.getBytes());
System.out.println(aString.getBytes());

打印:

[B@59887d29
[B@fd13cab
[B@71e606a9

E.g。以下断言总是失败:

Assert.assertEquals(aString.getBytes(), aString.getBytes());

doc,我没想到任何不确定性!我错过了什么?

当转换回String时,结果是预期的结果,所以我最好的猜测是一些未初始化的填充位?

即。以下断言总是通过:

Assert.assertEquals(new String(aString.getBytes()), new String(aString.getBytes()));

2 个答案:

答案 0 :(得分:6)

Assert#assertEquals(Object, Object)使用Object#equals(Object)来比较它的参数,但数组类型不会覆盖该方法。所以两个数组实例总是不同的。

使用Assert#assertArrayEquals(byte[], byte[])比较byte类型的数组。

答案 1 :(得分:4)

问题是getBytes()返回byte[],而数组在Java中是Object。但是,这些数组对象不会覆盖Object's toString() method,它负责您看到的输出。

  

换句话说,此方法返回一个等于值的字符串:

getClass().getName() + '@' + Integer.toHexString(hashCode())

输出包括哈希码,即使内容相同,每个对象也不同。

使用Arrays.toString获取包含数组内容的String,例如

System.out.println(Arrays.toString(aString.getBytes()));

3次。新产出:

[104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]
[104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]
[104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100]