为什么containsAll确实在第二种情况下返回true

时间:2015-07-12 16:51:01

标签: java collections set contains

它编译并运行没有问题,但我无法理解为什么第二个语句返回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

JDK 1.8

编辑:

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

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

1 个答案:

答案 0 :(得分:3)

由于s0.toCharArray()是基本数组(char[]),Arrays.asList(s0.toCharArray())是一个单个元素为char[]的List。 同样,new HashSet<>(Arrays.asList(s1.toCharArray()))是一个包含单个char[]的集合。

这两个char[]个对象不相等,因为数组不会覆盖Object的{​​{1}},每次调用equals都会创建一个新的数组isntance,所以甚至如果toCharArray[]s0==s1s0.toCharArray() != s1.toCharArray()为假。

在你的第一行代码中,我假设s0.toCharArray().equals(s1.toCharArray())将原始数组转换为引用数组(即从ArrayUtils.toObject转换为char[]),这就是为什么{{1 }}返回true(因为Character[]containsAll包含4个HashSet个实例,List类覆盖Character,所以{{1} Character中的{}包含在equals中。