繁体   English   中英

如何在内部避免重复?

[英]How sets avoid duplicates internally?

我对Collections框架中的set有疑问。 集合本身将如何识别重复项以及它将如何识别? 谁能解释一下它是如何实现的? 哈希码和等于方法将如何进入图片? 我需要一个简短的解释,因为它对我来说非常重要。

它大致类似于此

if (!collection.contains(element))
    collection.add(element);

而contains方法,将使用equals / hashcode。

在TreeSet中,元素存储在红黑树中,而HashSet使用HashMap。

事实上,它添加到容器的方式特定于元素(树上的点,哈希表中的桶),因此添加本身使用equals / hashcode。

这在Setjavadoc中有解释

不包含重复元素的集合。 更正式地说,集合不包含元素对e1和e2,使得e1.equals(e2)和至多一个null元素。

HashSet使用hashcode()解析对象应该去的bucket和equals()方法来检查位于该bucket上的对象的相等性

实际的实现取决于容器。 HashMap在给定hashCode查找项目,然后使用equals测试插入的对象和存储的对象(这是要求a.equals(b) iff b.equals(a) )的原因之一。

TreeMap ,在另一方面,依赖于结果compareTo方法(如果该元件实现Comparablecompare用实施的方法Comparator )。 如果compare返回0,则元素被视为“等于”。 (注意, compareTo应该与equals一致 ,即a.compareTo(b)==0 iff a.equals(b) )。

“你可以用这些例子来解释.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的键和key的相应值(即下面代码片段中的PRESENT)作为常量值(此值是虚拟值),我们都知道map的键是唯一的。 这就是它的工作原理。 代码如下:

private static final Object PRESENT = new Object();
public boolean add(E e) {
    return map.put(e, PRESENT)==null;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM