Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.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.util.List.subList()`究竟应该如何工作?_Java_List - Fatal编程技术网

`java.util.List.subList()`究竟应该如何工作?

`java.util.List.subList()`究竟应该如何工作?,java,list,Java,List,当列表通过调用list.sublistin fromIndex,int toIndex获得的子列表的方法进行结构修改时,索引以及索引和列表元素之间的关系会发生什么变化 我对Oracle JVM中观察到的实际操作不感兴趣;我对接口行为规范感兴趣,因此可以可靠地实现自己的列表类。这里的可靠性指的是能够通过实现java.util.list接口将一个java列表类与自己的列表类交换 甲骨文的报告似乎没有阐明上述问题。请注意,这与试图通过子列表以外的任何其他方式修改列表无关,这只是通过子列表进行修改,文档

当列表通过调用list.sublistin fromIndex,int toIndex获得的子列表的方法进行结构修改时,索引以及索引和列表元素之间的关系会发生什么变化

我对Oracle JVM中观察到的实际操作不感兴趣;我对接口行为规范感兴趣,因此可以可靠地实现自己的列表类。这里的可靠性指的是能够通过实现java.util.list接口将一个java列表类与自己的列表类交换

甲骨文的报告似乎没有阐明上述问题。请注意,这与试图通过子列表以外的任何其他方式修改列表无关,这只是通过子列表进行修改,文档确实支持这一点

例子: 假设我有一个包含6个元素a、B、C、D、E、F的列表。调用列表上的子列表1、4会生成一个包含元素B、C、D的子列表。然后,我在这个子列表上调用removeD。我想知道删除D后子列表将包含哪些元素?一些备选方案:

B、 C、E子列表是否保留原始索引范围? B、 C实际上不再是子列表1,4?
我的猜测是,既然子列表是用subList1,4指定的,那么列表上的窗口本身就必须是相同的大小,因此可以说E滑入视图,因为视图的结束索引仍然是4,现在D消失了,延伸到E之外。第二种选择对我来说似乎不是很明智,但是,这是一个备选方案。

以下引用的规范可能回答了这个问题,它可以在中找到,但有点令人惊讶,它不在java.util.List的文档中:

此实现返回一个将AbstractList子类化的列表。子类在专用字段中存储支持列表中子列表的偏移量、子列表在其生存期内可能更改的大小以及支持列表的预期modCount值

由于视图的大小可以更改,因此索引也可以更改,这意味着在问题中概述的示例场景中,元素E不会滑入视图。因此,第二种选择是正确的,因为删除D之后的子列表的大小减小了1,并且在该点处的子列表包含2个元素B、C

Java设计人员可能会故意选择在AbstractList页面中指定上述内容,而不是在List的documentation页面中,这样后者就保留了模糊性。然而,我希望实现list的两个不同的list类能够在这个特定的细节级别上轻松地交换和兼容。此外,并非每个列表实现都会扩展AbstractList——这是一种方便,而不是一种要求


下面是将引用的规范以及一些其他详细信息从AbstractList页面移到List documentation页面。

以下引用的规范可能会回答这个问题,可以在中找到,但有点令人惊讶的是,没有在java.util.List的文档中找到:

此实现返回一个将AbstractList子类化的列表。子类在专用字段中存储支持列表中子列表的偏移量、子列表在其生存期内可能更改的大小以及支持列表的预期modCount值

由于视图的大小可以更改,因此索引也可以更改,这意味着在问题中概述的示例场景中,元素E不会滑入视图。因此,第二种选择是正确的,因为删除D之后的子列表的大小减小了1,并且在该点处的子列表包含2个元素B、C

Java设计人员可能会故意选择在AbstractList页面中指定上述内容,而不是在List的documentation页面中,这样后者就保留了模糊性。然而,我希望实现list的两个不同的list类能够在这个特定的细节级别上轻松地交换和兼容。此外,并非每个列表实现都会扩展AbstractList——这是一种方便,而不是一种要求


下面是将引用的规范以及一些其他详细信息从AbstractList页面移到List documentation页面。

毫不奇怪,在接口的Javadoc中找到了答案:

返回的列表由该列表支持,因此返回列表中的非结构性更改将反映在此列表中,反之亦然。返回的列表支持此列表支持的所有可选列表操作。。。如果支持列表(即此列表)在结构上以任何方式修改,而不是通过返回的列表修改,则此方法返回的列表的语义将变得未定义


换句话说,可以通过子列表修改列表

毫不奇怪,在接口的Javadoc中找到了答案:

返回的列表由该列表支持,因此返回列表中的非结构性更改将反映在此列表中,反之亦然。返回的列表支持此列表支持的所有可选列表操作。。。如果支持列表(即此列表)在结构上以任何方式修改,而不是通过返回的列表修改,则此方法返回的列表的语义将变得未定义

换句话说,可以通过子列表修改列表

由于子列表是一个列表,删除元素必须减小其大小。此外,还必须从支持列表中删除该元素。Javadoc写道:

返回的列表由此列表支持

返回的列表支持此列表支持的所有可选列表操作

由于子列表是一个列表,删除元素必须减小其大小。此外,还必须从支持列表中删除该元素。Javadoc写道:

返回的列表由此列表支持

返回的列表支持此列表支持的所有可选列表操作


列表接口就是契约,不同的实现可以自由地对契约未指定的任何内容执行它们喜欢的操作

归根结底,您对x和y之间的列表部分的短语视图是静态的还是动态的解释-子列表是在创建子列表时处于x和y之间的支持列表部分的视图,还是在子列表上执行每个操作时处于动态的?根据合同,这两个读数都是可以接受的,不同的实现可以自由进行

特别是在remove契约中,没有任何规定在移除后列表必须比之前小,而且这并不像在多线程或事件侦听器中听起来那么奇怪。像箱子一样的

// lst contains B, C, D
lst.remove(D);
// lst contains B, C, E

可能是动态子列表的结果,也可能是另一个线程将E添加到列表中,或者可能是一个列表实现,在元素删除时触发事件,并且事件侦听器添加了E。无论哪种方式,都没有任何内容破坏列表契约。

列表接口就是契约,不同的实现可以自由地对合同中未指定的任何内容执行自己喜欢的操作

归根结底,您对x和y之间的列表部分的短语视图是静态的还是动态的解释-子列表是在创建子列表时处于x和y之间的支持列表部分的视图,还是在子列表上执行每个操作时处于动态的?根据合同,这两个读数都是可以接受的,不同的实现可以自由进行

特别是在remove契约中,没有任何规定在移除后列表必须比之前小,而且这并不像在多线程或事件侦听器中听起来那么奇怪。像箱子一样的

// lst contains B, C, D
lst.remove(D);
// lst contains B, C, E

可能是动态子列表的结果,也可能是另一个线程将E添加到列表中,或者可能是一个在元素删除时触发事件的列表实现,并且事件侦听器添加了E。无论哪种方式,都不会破坏列表契约。

尝试它真的有那么难吗?从字面上看,3行代码…嗯,我当然可以做到。我正在执行我自己的清单,所以不知为什么我没有想到这个主意。无论如何,有点奇怪的是,这种行为在文档中并没有更好的规定。你们说的并没有规定?有一篇关于学校行为的短文。特别是,如果支持列表在结构上进行了修改,则此方法返回的列表的语义将变得未定义。您忘记了句子的结尾:……以任何方式,而不是通过返回的列表。我已经非常彻底地阅读了这些文件。未指定的是视图是否有效滑动。我只是通过子列表修改列表,这样特别的警告根本不适用,尽管大多数人自然会发现它与我的问题有关。我不明白为什么只有两条对我的问题范围没有直接作用的评论被投了赞成票?请再次检查问题,并阅读以下部分:1我是如何遵守接口规范的,而不是事实上的行为;2我仅通过子列表修改列表。所以有时候让我惊讶…真的那么难尝试吗?从字面上看,3行代码…嗯,我当然可以做到。我正在执行我自己的清单,所以不知为什么我没有想到这个主意。无论如何,有点奇怪的是,这种行为在文档中并没有更好的规定。你们说的并没有规定?有一篇关于学校行为的短文。特别是,如果支持列表在结构上进行了修改,则此方法返回的列表的语义将变得未定义。您忘记了句子的结尾:……以任何方式,而不是通过返回的列表。我有
仔细阅读文档。未指定的是视图是否有效滑动。我只是通过子列表修改列表,这样特别的警告根本不适用,尽管大多数人自然会发现它与我的问题有关。我不明白为什么只有两条对我的问题范围没有直接作用的评论被投了赞成票?请再次检查问题,并阅读以下部分:1我是如何遵守接口规范的,而不是事实上的行为;2我仅通过子列表修改列表。所以有时候我会感到惊讶…没有“歧义”。所有这些都在列表接口中指定,列表接口是所有实现都必须遵守的契约。你好像小题大做。你看过名单上的文件了吗?它不在那里。List.subList的页面上没有任何内容,包括指定在我在问题中描述的场景中会发生什么。如果它被指定了,这就是你希望我相信的,那么为什么AbstractList上的页面要写这么多关于它的内容呢?你提到的合同正是我想要的。合同必须明确,而不是字里行间暗指。我对这个答案投了赞成票,因为我认为它是与这个问题最相关的答案。我在这篇文章中寻找如何为实现列表接口的相对复杂的集合实现subList函数。为了正确地完成它,我将创建一个几乎和我最初创建的类一样复杂的类。所以我的实现看起来像{throw new NotImplementedException;}。我个人的观点是,这个例程并不适合放在这样一个低级别的界面上。没有“模糊性”。所有这些都在列表接口中指定,列表接口是所有实现都必须遵守的契约。你好像小题大做。你看过名单上的文件了吗?它不在那里。List.subList的页面上没有任何内容,包括指定在我在问题中描述的场景中会发生什么。如果它被指定了,这就是你希望我相信的,那么为什么AbstractList上的页面要写这么多关于它的内容呢?你提到的合同正是我想要的。合同必须明确,而不是字里行间暗指。我对这个答案投了赞成票,因为我认为它是与这个问题最相关的答案。我在这篇文章中寻找如何为实现列表接口的相对复杂的集合实现subList函数。为了正确地完成它,我将创建一个几乎和我最初创建的类一样复杂的类。所以我的实现看起来像{throw new NotImplementedException;}。我个人的意见是,这个例程并不适合放在这样一个低级别的界面上。问题是,一个人可以用多种方式支持列表和所有列表操作。从技术上讲,删除合同中没有规定必须减少列表的大小。@Ian,这与我最初的问题几乎没有什么关系,但我很好奇——您是否愿意投入一些时间来证明,鉴于列表中包含一个元素,删除它可能不会减少列表的大小?只是好奇,谢谢。@amn:是的,但是支持列表必须支持同一操作的要求只有在子列表调用该操作时才有用——如果调用了该操作,则语义是非常清楚的,不是吗?问题是一个人可以支持一个列表并以多种方式支持所有列表操作。从技术上讲,删除合同中没有规定必须减少列表的大小。@Ian,这与我最初的问题几乎没有关系,但我很好奇——您是否愿意投入一些时间来证明,鉴于列表中包含一个元素,删除它可能不会减少列表的大小?只是好奇,谢谢。@amn:是的,但是支持列表必须支持同一操作的要求只有在子列表调用该操作时才有用——如果调用了该操作,那么语义是很清楚的,不是吗?