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

Java 为什么containsAll在第二种情况下返回true,java,collections,set,contains,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()))));

它编译和运行没有问题,但我不理解为什么第二条语句返回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())));
JDK1.8

编辑:

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

new HashSet<Character>(Arrays.asList(s1.toCharArray())).containsAll(Arrays.asList(s0.toCharArray()));
newhashset(Arrays.asList(s1.toCharArray()).containsAll(Arrays.asList(s0.toCharArray());
因为
s0.toCharArray()
是一个基本数组(
char[]
),
数组。asList(s0.toCharArray())
是一个列表,其单个元素是
char[]
。 类似地,
newhashset(Arrays.asList(s1.toCharArray())
是一个包含单个
char[]
的集合

这两个
char[]
对象是不相等的,因为数组不会覆盖
Object
equals
,每次调用
tocharray[]
都会创建一个新的数组存在,所以即使
s0==s1
s0.tocharray()!=s1.tocharray()
s0.tocharray().equals(s1.tocharray())
为false


在第一行代码中,我假设
ArrayUtils.toObject
将基本数组转换为引用数组(即从
char[]
转换为
Character[]
),这就是
containsAll
返回true的原因(由于
哈希集
列表
都包含4个
字符
实例,并且
字符
类重写
等于
,因此
列表
中的所有
字符
都包含在
哈希集中
).

有道理,谢谢!Eran,你的假设是对的。
ArrayUtils
为每个基本数组类型提供了一个
toObject
实现:
new HashSet<Character>(Arrays.asList(s1.toCharArray())).containsAll(Arrays.asList(s0.toCharArray()));