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

2022-08-31 17:37:56

假设我在Java中有这个代码:

HashSet<String> wordSet = new HashSet<String>();
String a = "hello";
String b = "hello";
wordSet.add(a);

会回来还是?根据我的理解,并引用不同的对象,即使它们的值是相同的。所以应该回来。但是,当我运行此代码时,它会返回 .只要 b 包含值“hello”,无论 String 对象 b 来自何处,它都会始终返回 true 吗?我能一直保证这一点吗?如果没有,我什么时候不能保证这一点?如果我想对字符串以外的对象执行类似操作,该怎么办?wordSet.contains(b);truefalseabcontains()falsetrue


答案 1

它用于比较数据。下面来自 javadoc for Setequals()

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

String 的方法逐个字符地进行比较。从 javadoc for Stringequals()

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


答案 2

实际上,HashSet两者都没有

它的实现使用HashMap,下面是确定该集合的相关代码(实际上它位于HashMap的getEntry()方法中):contains()

if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))

哪:

  • 要求哈希值相等,并且
  • 需要对象相等或返回 trueequals()

答案是“是”:总是会回来的wordSet.contains(b)true