gpt4 book ai didi

java - Set 接口(interface)如何强制不重复添加且不保留插入顺序规定

转载 作者:行者123 更新时间:2023-12-02 01:24:32 24 4
gpt4 key购买 nike

Q.1) 如 AbstractSet 的文档中所述- “此类不会覆盖 AbstractCollection 类的任何实现。”如果它没有覆盖更改 add(Object o) 或由 实现的任何其他 Collection 接口(interface)协定>AbstractCollection 类,并且仅继承它们,因此 HashSet .

HashSet 和其他 Set 对象如何强制执行规定,例如无重复添加检查或插入元素的 Hashtable 方式,这是完全不同的List 或其他 Collection 对象如何添加元素。

Q.2) 在文档中,对于 AbstractSet据记载,AbstractSet 只是添加了 equalshashcode 的实现。然而,在方法细节部分,提到Object类已经重写了equalshashcode方法。 AbstractSet 是否只是继承而不对这两个方法做任何更改?如果是这样,AbstractSet 类的重要性是什么?请澄清

最佳答案

问题1:HashSet如何强制重复检查?

如果您查看 java.util.HashSet 中的实现,您将看到以下代码:-

private static final Object PRESENT = new Object();

public boolean add(E e) {
return map.put(e, PRESENT)==null;
}

发生的事情相当简单;我们使用私有(private) HashMap 实例,它接受我们提供的值并将其插入作为 HashMap 的键。映射的 PRESENT 值从未实际使用或检索,但它允许我们使用此支持映射来验证该项目是否存在于 Set 中。

如果 map 中不存在我们提供的值,则调用map.put()会将项目放入 map 中并返回我们的对象。否则,映射保持不变并且该方法返回 null。 HashMap 在这里为 HashSet 做艰苦的工作。

这与 AbstractCollection 类提供的实现不同,因此需要重写。

Q2:AbstractSet对equals() & hashCode()的使用

我认为您稍微误解了 AbstractSet 在这里所做的事情。 AbstractSet 的目的是提供 equals 和 hashCode 的集合安全实现。

等于检查是通过验证我们正在比较两个 Set 对象、它们大小相等并且包含相同的项目来执行的。

public boolean equals(Object o) {
if (o == this)
return true;
if (!(o instanceof Set))
return false;
Collection<?> c = (Collection<?>) o;
if (c.size() != size())
return false;
try {
return containsAll(c);
} catch (ClassCastException unused) {
return false;
} catch (NullPointerException unused) {
return false;
}
}

hashCode 是通过循环 Set 实例并迭代地散列每个项目来生成的:

public int hashCode() {
int h = 0;
Iterator<E> i = iterator();
while (i.hasNext()) {
E obj = i.next();
if (obj != null)
h += obj.hashCode();
}
return h;
}

任何从 AbstractSet 扩展的类都将使用 equals() 和 hashCode() 的实现,除非它显式覆盖它们。此实现优先于 java.lang.Object 中定义的默认 equals 和 hashCode 方法。

关于java - Set 接口(interface)如何强制不重复添加且不保留插入顺序规定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57142858/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com