为什么 containsAll 在第二种情况下 return 为真

Why containsAll does return true in second case

它编译和运行没有问题,但我不明白为什么第二条语句 return false:

    String s0 ="0123";
    String s1 ="0123";


    System.out.println(new HashSet<>(Arrays.asList(ArrayUtils.toObject(s1.toCharArray()))).containsAll(Arrays.asList(ArrayUtils.toObject(s0.toCharArray()))));
    System.out.println(new HashSet<>(Arrays.asList(s1.toCharArray())).containsAll(Arrays.asList(s0.toCharArray())));

输出:

true
false

JDK1.8

编辑:

谢谢@Eran 当我像这样避免菱形运算符时会出现编译问题:

new HashSet<Character>(Arrays.asList(s1.toCharArray())).containsAll(Arrays.asList(s0.toCharArray()));

因为s0.toCharArray()是原始数组(char[]),所以Arrays.asList(s0.toCharArray())是一个列表,其单个元素是char[]。 同样,new HashSet<>(Arrays.asList(s1.toCharArray())) 是一个包含单个 char[] 的集合。

这两个 char[] 对象不相等,因为数组不会覆盖 Objectequals 并且每次调用 toCharArray[] 都会创建一个新的数组实例,所以即使 s0==s1s0.toCharArray() != s1.toCharArray()s0.toCharArray().equals(s1.toCharArray()) 为假。

在您的第一行代码中,我假设 ArrayUtils.toObject 将原始数组转换为参考数组(即从 char[]Character[]),这就是为什么 containsAll returns true(因为 HashSetList 都包含 4 个 Character 实例,并且 Character class 覆盖 equals, 所以 List 中的所有 Character 都包含在 HashSet).