Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/398.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
理解Java中的Set接口_Java_Generic Collections - Fatal编程技术网

理解Java中的Set接口

理解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

我一直在努力理解在Java中自定义实现集合接口背后的整个抽象思想。在我们的讲座中,我们实现了函数集,甚至是标志集,这两个集合看起来都是固有的递归列表,其功能是为集合实现而精确构建的

在一天结束时,即使一些自定义实现没有从列表中删除对象,也只需使用简单的for-each循环从集合中调用集合中的对象

例如,在前面提到的这个函数集中,{1,2,3}表示为add3,add2,add1,Empty,而直接在后面调用的remove(2)方法类似于remove 2,Add 3,Add 2,Add 1,Empty。Java根据什么来决定元素是否是集合的一部分?它是否只对add()和remove()方法起作用,以确定对象是否仍然存在于集合中


我希望我的话足够连贯。

您是否检查了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有点提过)确定元素是否应包含在集合中?