我对 Collections 框架中的集合有疑问。集合本身将如何识别重复项以及它将如何知道?谁能解释一下它是如何实现的?hashcode 和 equals 方法将如何出现?我需要一个简短的解释,因为这对我来说真的很重要。
6 回答
它大致是这样工作的
if (!collection.contains(element))
collection.add(element);
而 contains 方法将使用 equals/hashcode。
在 TreeSet 中,元素存储在红黑树中,而 HashSet 使用 HashMap。
事实上,它添加到容器的方式是特定于元素的(树上的点,哈希表中的桶),因此添加本身使用 equals/hashcode。
这在用于Set
.
不包含重复元素的集合。更正式地说,集合不包含一对元素 e1 和 e2 使得 e1.equals(e2),并且最多包含一个空元素。
实际实现取决于容器。HashMap
查找给定的项目,hashCode
然后通过使用测试插入的对象和存储的对象equals
(这是要求a.equals(b)
iff的原因之一b.equals(a)
)。
TreeMap
另一方面,依赖于compareTo
方法的结果(如果元素实现Comparable
或compare
由 a 实现的方法Comparator
)。如果compare
返回 0,则元素被视为“等于”。(注意compareTo
应该与equals一致,即a.compareTo(b)==0
iff a.equals(b)
)。
HashSet
使用hashcode()
toresolve bucket 对象应该去的地方和equals()
方法来检查位于该桶上的对象的相等性
"你能用这些例子解释一下吗。s.add("123");s.add("123");"
对于上面在 Set 接口上下文中解释的查询,请参考下面的代码片段和解释。
public void setTest() {
Set<String> obj = new HashSet<>();
System.out.println(obj.add("123")); //Output : true
System.out.println(obj.add("123")); //Output : false
}
如果您在上面的代码段中注意到,我们已经添加了 123 两次。第一次添加 SOP 将返回 true。然后第二次添加“123”,SOP 将返回 false。
由此我们可以理解,如果我们在 Set 中第二次或更多次添加相同的值,那么重复的值将被跳过。
基本上 set 是一个接口,它有很多不同的实现,现在让我们以 HashSet 实现为例,为了回答你的问题,我下载了源代码并进入了 HashSet 类,然后我搜索了 add 方法,发现它使用 HashMap 来存储唯一值. 它使用要存储的值作为 HashMap 的键,并将键的对应值(即下面代码片段中的 PRESENT)作为常量值(该值是一个虚拟值),我们都知道 map 的键是唯一的。这就是它的工作原理。下面的代码:
private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT)==null;
}