Java HashSet 是否作用于字符串引用或值?

Phi*_*lip 0 java string reference hashset

我有以下内容。

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 ); 
Run Code Online (Sandbox Code Playgroud)

set1 最终会只包含“A”,还是也会包含“B”?

小智 5

HashSet使用对象相等( Object.equals),而不是身份(“引用相等”)。

此外,HashSet使用Object.hashCode了哈希函数。

不幸的是,要“了解”这一点,需要“阅读”文档并了解哈希是如何实现的。从文档中HashSet.contains

如果此集合包含指定的元素,则返回 true。更正式地说,当且仅当此集合包含元素 e 使得 (o==null ? e==null : o.equals(e) )时才返回 true 。

更一般的Set文档说:

不包含重复元素的集合。更正式地说,集合不包含一对元素 e1 和 e2 使得e1.equals(e2),并且至多一个空元素。正如其名称所暗示的那样,该接口对数学集合抽象进行建模。

除了极少数例外,例如IdentityHashMap,Java 中的数据结构处理的是相等性而不是身份

因此,为了回答这个问题,HashSet 处理“字符串值”。

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