我有以下。
HashSet<String> set1 = new HashSet<String>();
HashSet<String> set2 = new HashSet<String>();
String strB1 = "B";
String strB2 = "B";
set1.add( "A" );
set1.add( strB1 );
set2.add( strB2 );
set1.removeAll( set2 );
set1 最终会只包含“A”,还是也包含“B”?
HashSet
使用对象相等( Object.equals
),而不是标识(“引用相等”)。
此外,HashSet
用于Object.hashCode
散列函数。
不幸的是,要“知道”这一点,需要稍微“阅读”文档并了解哈希是如何实现的。从文档中HashSet.contains
:
如果此集合包含指定的元素,则返回 true。更正式地说,当且仅当此集合包含满足 (o==null ? e==null : o.equals(e) ) 的元素 e 时才返回 true。
更一般的Set
文档说:
不包含重复元素的集合。更正式地说,集合不包含e1.equals(e2)的元素对 e1 和 e2 ,并且最多包含一个空元素。正如它的名字所暗示的,这个接口模拟了数学集合抽象。
除了极少数例外,例如IdentityHashMap
,Java 中的数据结构在相等性而不是身份上工作。
因此,为了回答这个问题,HashSet 对“字符串值”起作用。
(由于字符串实习,此示例可能特别具有误导性,但这不会改变上述内容,因为身份意味着相等,即使反之亦然。)
Java 中的字符串被特殊处理。出于优化目的,任何字符串文字都会被缓存和重用。因此 strB1 和 strB2 将持有相同的引用,因此结果 set1 应该只在代码执行后包含“A”。
至少根据 Java 文档和 SCJP 培训书籍。
但是正如评论中发布的那样,尝试它比在这里发布要快......