为什么 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[]
对象不相等,因为数组不会覆盖 Object
的 equals
并且每次调用 toCharArray[]
都会创建一个新的数组实例,所以即使 s0==s1
、s0.toCharArray() != s1.toCharArray()
和 s0.toCharArray().equals(s1.toCharArray())
为假。
在您的第一行代码中,我假设 ArrayUtils.toObject
将原始数组转换为参考数组(即从 char[]
到 Character[]
),这就是为什么 containsAll
returns true(因为 HashSet
和 List
都包含 4 个 Character
实例,并且 Character
class 覆盖 equals
, 所以 List
中的所有 Character
都包含在 HashSet
).
中
它编译和运行没有问题,但我不明白为什么第二条语句 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[]
对象不相等,因为数组不会覆盖 Object
的 equals
并且每次调用 toCharArray[]
都会创建一个新的数组实例,所以即使 s0==s1
、s0.toCharArray() != s1.toCharArray()
和 s0.toCharArray().equals(s1.toCharArray())
为假。
在您的第一行代码中,我假设 ArrayUtils.toObject
将原始数组转换为参考数组(即从 char[]
到 Character[]
),这就是为什么 containsAll
returns true(因为 HashSet
和 List
都包含 4 个 Character
实例,并且 Character
class 覆盖 equals
, 所以 List
中的所有 Character
都包含在 HashSet
).