byte arr[] = new byte[] {56, 99, 87, 77, 73, 90, 105, -23, -52, -85, -9, -55, -115, 11, -127, -127};
        String s= new String(arr);
        Arrays.equals(arr, s.getBytes()));  // returns false

为什么数组不相等?

推荐答案

这取决于你的Charset.defaultCharset()分.这决定了字节的解释方式.负值可能是表示代码点的一种非规范方式.

(见这个伟大的答案:https://stackoverflow.com/a/7934397/461499)

然后,将getBytes()重新解释为String将成为标准方式,并返回true

    System.out.println(Charset.defaultCharset()); //UTF-8 here :)

    byte arr[] = new byte[] {56, 99, 87, 77, 73, 90, 105, -23, -52, -85, -9, -55, -115, 11, -127, -127};
    String s= new String(arr);
    System.out.println(s);
    // [56, 99, 87, 77, 73, 90, 105, -17, -65, -67, -52, -85, -17, -65, -67, -55, -115, 11, -17, -65, -67, -17, -65, -67]

    byte arr2[] = new byte[] {56, 99, 87, 77, 73, 90, 105, -17, -65, -67, -52, -85, -17, -65, -67, -55, -115, 11, -17, -65, -67, -17, -65, -67};
    System.out.println(Arrays.toString(s.getBytes()));  
    System.out.println(Arrays.equals(arr, s.getBytes()));  // returns false

    String s2= new String(arr2);
    System.out.println(Arrays.toString(s2.getBytes()));
    System.out.println(Arrays.equals(arr2, s2.getBytes()));  // returns true

Java相关问答推荐

我应该避免在Android中创建类并在运行时编译它们吗?

将Nimbus设置为计算机上运行的所有Java应用程序的默认外观

Oracle DUAL表上使用DDL时jOOQ问题的解析'

参数值[...]与预期类型java.util.Date不匹配

使用REST客户端和对象映射器从字符串反序列化Json

Java:使用Class.cast()将对象转换为原始数组

放气总是压缩整个街区吗?

在Eclipse中调试未导出的JDK模块的Java包

使用Jackson库反序列化json

Instancio未在日志(log)中显示测试失败消息

使用While循环打印素数,无法正常工作

如何在Spring Boot中创建可以将值传递给配置的&Enable&Quot;注释?

Android应用程序为错误的显示类型 Select 尺寸文件

Spring Framework6.1中引入的新RestClient是否有适合于测试的变体,就像RestTemplate和TestRestTemplate一样?

寻找Thread.sky()方法的清晰度

每次我需要时创建和关闭数据库连接会有什么效果吗?

JavaFX标签中的奇怪字符

Cucumber java-maven-示例表-未定义一步

PhantomReference无法访问时会发生什么?

如何解释泛型类层次 struct 中子类的返回值类型和参数定义?