理解Java中的Set接口
我一直在努力理解在Java中自定义实现集合接口背后的整个抽象思想。在我们的讲座中,我们实现了函数集,甚至是标志集,这两个集合看起来都是固有的递归列表,其功能是为集合实现而精确构建的 在一天结束时,即使一些自定义实现没有从列表中删除对象,也只需使用简单的for-each循环从集合中调用集合中的对象 例如,在前面提到的这个函数集中,{1,2,3}表示为add3,add2,add1,Empty,而直接在后面调用的remove(2)方法类似于remove 2,Add 3,Add 2,Add 1,Empty。Java根据什么来决定元素是否是集合的一部分?它是否只对add()和remove()方法起作用,以确定对象是否仍然存在于集合中理解Java中的Set接口,java,generic-collections,Java,Generic Collections,我一直在努力理解在Java中自定义实现集合接口背后的整个抽象思想。在我们的讲座中,我们实现了函数集,甚至是标志集,这两个集合看起来都是固有的递归列表,其功能是为集合实现而精确构建的 在一天结束时,即使一些自定义实现没有从列表中删除对象,也只需使用简单的for-each循环从集合中调用集合中的对象 例如,在前面提到的这个函数集中,{1,2,3}表示为add3,add2,add1,Empty,而直接在后面调用的remove(2)方法类似于remove 2,Add 3,Add 2,Add 1,Empt
我希望我的话足够连贯。您是否检查了Oracle提供的java源代码?这是一个好的开始。检查类集合中的方法可以回答您的问题 set和list的主要区别在于set不遵守顺序。因此,如果您按特定顺序添加项目,则不保证按相同顺序将其取回。这是因为Set优化了顺序以获得尽可能快的访问时间。因此,在大多数情况下,设置为fasert Java根据什么来决定元素是否是集合的一部分 函数集实现的作者在任何基础上编程。Java中没有内置这样的实现,因此我们无法知道是否有源代码供您检查 在我们的讲座中,我们实现了函数集,甚至是标志集,这两个集合看起来都是固有的递归列表,其功能是为集合实现而精确构建的 这些实现对于Java集可能不是特别有指导意义。Java集合是可变的。。。不起作用。无论如何,javadoc为
Java.util.Set
接口提供了JavaSETAPI的一般规范
Java根据什么来决定元素是否是集合的一部分 集合/集合“契约”要求它使用
equals(Object)
来确定这一点。例如,方法指定如下:
如果此集合包含指定的元素[o],则返回true。更正式地说,当且仅当此集合至少包含一个元素e
且(o==null?e==null:o.equals(e))
时,才返回true
不同的set实现使用Comparable
/Comparator
API或Object.hashCode()
来增强或替换它。详细信息在各自的实现类javadocs中
但是,不能保证自定义集合
实现将遵守合同
它是否只对add()和remove()方法起作用,以确定对象是否仍然存在于集合中 其他
Set
方法(如contains()
)也需要知道对象是否是Set成员。。。如果你问的是这个问题。从右边开始(从空的)到左边工作。最终得到的是在该点的集合状态
代码所做的是从现有集合(从空集合开始)和单个更改(添加或删除元素)创建一个新的不可变集合。这就是你在函数式语言中编写集合的方式,因为一切都是不可变的。你在问,删除不存在的项或添加了两次的项是否与理论集合的行为不一致?然后不,Set
通过add()
和remove()
学习和忘记成员。“我希望我足够连贯。”-不是真的。。。我搞不懂你的第二个问题到底在问什么。LinkedHashSet保留插入顺序。我猜对于自定义实现的集合,如前面提到的函数集,我必须区分概念集和递归列表,我使用它们作为构建和定义集合的基础。因为集合中的元素最终只是用一个标准来调用,每个循环在集合中迭代(至少提供的测试模块是这样做的),这是否意味着接口隐式地“查看”add()和remove()的日志(下面@william.berg有点提过)确定元素是否应包含在集合中?