1

我一直在努力理解 Java 中 Set 接口的自定义实现背后的整个抽象概念。在我们的讲座中,我们已经实现了功能集甚至标志集,这两者似乎都是固有的递归列表,具有为集合实现精确构建的功能。

归根结底,即使某些自定义实现不会从列表中删除对象,也可以使用简单的 for-each 循环从集合中简单地调用集合中的对象。

例如,在提到的这个函数集中,{1,2,3} 表示为 Add 3, Add 2, Add 1, Empty,而直接调用的 remove(2) 方法看起来像 Remove 2, Add 3, Add 2 ,加1,空。那么 Java 在什么基础上决定元素是否是集合的一部分?它是否仅适用于 add() 和 remove() 方法来确定对象是否仍然存在于集合中?

我希望我足够连贯。

4

5 回答 5

2

在我们的讲座中,我们已经实现了功能集甚至标志集,这两者似乎都是固有的递归列表,具有为集合实现精确构建的功能。

这些实现不太可能对 Java Sets 有特别的指导意义。Java 集是可变的……没有功能。无论如何,Java Set API 的通用规范由java.util.Set接口的 javadoc 给出。


那么 Java 在什么基础上决定元素是否是集合的一部分?

Set / Collection“合同”要求它使用equals(Object)来确定这一点。例如,Collection.contains(Object)方法指定如下:

“如果此集合包含指定元素 [o],则返回 true。更正式地说,当且仅当此集合包含至少一个e这样的元素时,才返回 true (o==null ? e==null : o.equals(e))。”

不同的集合实现用Comparable/ ComparatorAPI 或Object.hashCode(). 详细信息在各自的实现类 javadocs 中。

但是,不能保证自定义Set实现会遵守合同。


它是否仅适用于 add() 和 remove() 方法来确定对象是否仍然存在于集合中?

其他Set方法(例如contains())也需要知道一个对象是否是一个集合成员......如果这是您所要求的。

于 2012-12-17T22:49:01.413 回答
0

你查过Oracle提供的java源代码吗?这是一个很好的起点。检查类 Set 中的方法将回答您的问题。

set 和 list 之间的主要区别在于 set 不尊重顺序。因此,如果您按特定顺序添加项目,则无法保证以相同的顺序将它们取回。这是因为 Set 优化了顺序以实现尽可能快的访问时间。因此 Set 在大多数情况下更快。

于 2012-12-17T22:46:44.250 回答
0

那么 Java 在什么基础上决定元素是否是集合的一部分?

功能集实现的作者在任何基础上进行了编程。Java 中没有内置这样的实现,因此我们无法知道是否有源代码供您检查。

于 2012-12-17T22:48:05.850 回答
0

从右侧(从Empty)开始,向左工作。你最终得到的是那个时候的 set 状态。

您的代码所做的是从现有集(从空集开始)和单个更改(添加或删除元素)创建一个新的不可变集。这就是你用函数式语言编写集合的方式,因为一切都是不可变的。

于 2012-12-17T22:51:29.770 回答
0

您问的是删除不存在或已添加两次的项目是否以与理论集合不一致的方式行事?然后不,通过andSet学习和忘记成员。add()remove()

于 2012-12-17T22:52:00.830 回答