我无法弄清楚为什么在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()));
答案 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]