[英]How sets avoid duplicates internally?
我对Collections框架中的set有疑问。 集合本身将如何识别重复项以及它将如何识别? 谁能解释一下它是如何实现的? 哈希码和等于方法将如何进入图片? 我需要一个简短的解释,因为它对我来说非常重要。
它大致类似于此
if (!collection.contains(element))
collection.add(element);
而contains方法,将使用equals / hashcode。
在TreeSet中,元素存储在红黑树中,而HashSet使用HashMap。
事实上,它添加到容器的方式特定于元素(树上的点,哈希表中的桶),因此添加本身使用equals / hashcode。
HashSet
使用hashcode()
解析对象应该去的bucket和equals()
方法来检查位于该bucket上的对象的相等性
实际的实现取决于容器。 HashMap
在给定hashCode
查找项目,然后使用equals
测试插入的对象和存储的对象(这是要求a.equals(b)
iff b.equals(a)
)的原因之一。
TreeMap
,在另一方面,依赖于结果compareTo
方法(如果该元件实现Comparable
或compare
用实施的方法Comparator
)。 如果compare
返回0,则元素被视为“等于”。 (注意, compareTo
应该与equals一致 ,即a.compareTo(b)==0
iff a.equals(b)
)。
对于上面使用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.