0

我有以下。

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”?

4

2 回答 2

5

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 对“字符串值”起作用。

(由于字符串实习,此示例可能特别具有误导性,但这不会改变上述内容,因为身份意味着相等,即使反之亦然。)

于 2012-07-07T22:41:19.930 回答
0

Java 中的字符串被特殊处理。出于优化目的,任何字符串文字都会被缓存和重用。因此 strB1 和 strB2 将持有相同的引用,因此结果 set1 应该只在代码执行后包含“A”。

至少根据 Java 文档和 SCJP 培训书籍。

但是正如评论中发布的那样,尝试它比在这里发布要快......

于 2012-07-07T22:25:35.743 回答