我希望两个相同字符串的字节表示也相同,但似乎并非如此。下面是我用来测试它的代码。
String test1 = "125";
String test2 = test1;
if(test1.equals(test2))
{
System.out.println("These strings are the same");
}
byte[] array1 = test1.getBytes();
byte[] array2 = test2.getBytes();
if(array1.equals(array2))
{
System.out.println("These bytes are the same");
}
else
{
System.out.println("Bytes are not the same:\n" + array1 + " " + array2);
}
提前感谢您的帮助!
答案 0 :(得分:5)
两个相同但不相关的String
对象的字节表示肯定是逐字节相同的。但是,只要String
对象不相关,它们就不会是相同的数组对象。
您的代码正在错误地检查数组相等性。以下是解决问题的方法:
if(Arrays.equals(array1, array2)) ...
此外,即使您多次在同一个getBytes
对象上调用String
,您也会获得不同的字节数组:
String test = "test";
byte[] a = test.getBytes();
byte[] b = test.getBytes();
if (a == b) {
System.out.println("same");
} else {
System.out.println("different");
}
The above code prints "different"
.
这是因为String
不会保留getBytes
的结果。
注意:您的代码会在同一个对象上调用getBytes
两次,因为这行
String test2 = test1;
不会复制字符串,但会创建对同一字符串对象的第二个引用。
答案 1 :(得分:5)
问题是array1.equals(array2)
没有按照你的想法行事;它返回等效但不是引用相同的数组。如果您使用Arrays.equals(array1, array2)
,那就可以了。
答案 2 :(得分:1)
getBytes()都会返回不同的值,因此当我们调用时,我们会得到不同的值
System.out.println("1 test1.getBytes() "+test1.getBytes());
System.out.println("2 test2.getBytes() "+test2.getBytes());
两个值都不同,分别存储在byte [] array1和byte [] array2中, 由于两者都是不同的字节,因此创建了2个新的字节数组,因此它们与equals方法的比较比较了引用并返回false。
所以使用Arrays.equals(array1, array2)
来比较这些2字节数组中的实际内容。
答案 3 :(得分:1)
关于equals
的更多解释:
equals
中的Object
方法与==
相同;也就是说,它会比较两个引用,看它们是否相等。
但是,equals
类中的String
被重写,因此两个字符串上的equals
会比较字符串的内容而不是引用。这就是为什么在比较equals
s而不是String
时需要使用==
。 Java运行时中的许多其他类也会覆盖equals
,因此它们除了比较引用之外还执行其他操作。
数组类(数组对象所属的“类”)但不覆盖equals
。我认为主要原因是没有命名数组类,其中可能出现重写equals
。因此,使用equals
来比较适用于String
s的内容的想法对数组不起作用。结果是,对于数组x
,x.equals(y)
与x == y
相同(如果x
不是null
)。它使用equals
中的继承Object
。
这就是提供Arrays
类的原因:为了给你一些无法提供的方法,因为没有可以放入的类。Arrays.equals
和Arrays.toString
是两个您使用的方法代替x.equals
或x.toString
。