它编译并运行没有问题,但我无法理解为什么第二个语句返回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()));
答案 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==s1
和s0.toCharArray() != s1.toCharArray()
为假。
在你的第一行代码中,我假设s0.toCharArray().equals(s1.toCharArray())
将原始数组转换为引用数组(即从ArrayUtils.toObject
转换为char[]
),这就是为什么{{1 }}返回true(因为Character[]
和containsAll
包含4个HashSet
个实例,List
类覆盖Character
,所以{{1} Character
中的{}包含在equals
中。