Java HashSet <String>的contains()方法会测试字符串或对象标识的相等性吗?

Oko*_*onX 47 java string reference hashset

假设我在Java中使用此代码:

HashSet<String> wordSet = new HashSet<String>();
String a = "hello";
String b = "hello";
wordSet.add(a);
Run Code Online (Sandbox Code Playgroud)

wordSet.contains(b);回来true还是false?根据我的理解,即使它们的值相同,a也可以b参考不同的对象.所以contains()应该回来false.但是,当我运行此代码时,它返回true.只要包含值,无论String对象来自哪里,它总会返回吗?我总是保证这个吗?truebb"hello"如果没有,我什么时候不保证这个?如果我想用除Strings之外的对象做类似的事情怎么办?

Ara*_*ram 53

它用于equals()比较数据.下面是来自setjavadoc

如果集合不包含元素e2,则将指定的元素e添加到此集合中(e == null?e2 == null:e.equals(e2)).

equals()String 的方法进行逐字符比较.从字符串javadoc

当且仅当参数不为null并且是表示与此对象相同的字符序列的String对象时,结果才为真


Boh*_*ian 6

实际上,HashSet都没有.

它的实现使用HashMap,这里是确定集合的相关代码contains()(实际上它是在HashMap的getEntry()方法中):

if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))
Run Code Online (Sandbox Code Playgroud)

哪一个:

  • 要求哈希相等,并且
  • 要求无论是对象相等或equals()返回true

答案是"是":wordSet.contains(b)将永远回归true