Java:相同的字符串返回不同的字节数组

时间:2014-04-21 18:54:54

标签: java string byte

我希望两个相同字符串的字节表示也相同,但似乎并非如此。下面是我用来测试它的代码。

    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);
    }

提前感谢您的帮助!

4 个答案:

答案 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的内容的想法对数组不起作用。结果是,对于数组xx.equals(y)x == y相同(如果x不是null)。它使用equals中的继承Object

这就是提供Arrays类的原因:为了给你一些无法提供的方法,因为没有可以放入的类。Arrays.equalsArrays.toString是两个您使用的方法代替x.equalsx.toString