Java 为什么containsAll在第二种情况下返回true
它编译和运行没有问题,但我不理解为什么第二条语句返回false: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()))));
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()));