Java集合方法retainAll()是否保证不改变修改后列表的顺序?

3
它是否取决于使用retainAll的哪个集合对象?我正在使用字符串列表。
我搜索了很多,发现在这里和其他在线资源上有很多提示,表明它应该不改变列表的顺序,但没有明确的直接答案。如果已经回答了,请指出正确的方向。
我甚至找到了实现retainAll函数的代码示例,表明顺序没有被改动。但是我理解这些示例可能并不完全符合下载的java包中标准方法的编码。从我自己使用该方法的测试来看,它似乎保持原状。但是,由于我正在进行的测试特别依赖于列表保持原样,因此我想更加确定。
为了更加准确,我希望该功能是真实且稳健的。
 /**
 * This function takes the expected list and verifies it is contained within the actual list, in the expected order
 * @param expectedList {@link List} List ordered as it should be to pass criteria
 * @param actualList {@link List} List ordered as it exists in the product
 * @return {@link Boolean} returns true when the expectedList is ordered within the actualList correctly
 */
static boolean verifyOrder(List<String> expectedList, List<String> actualList)
{
    boolean ordered = false

    if (expectedList == actualList)
        ordered = true
    else
    {
        actualList.retainAll(expectedList)
        if (actualList == expectedList)
            ordered = true
    }
    return ordered
}

如果这不仅仅是伪代码:那个 == 比较没有意义。你应该使用 equals 来比较对象。 - Marco13
1
List 保证它将维护元素的顺序。虽然 retainAll 的契约没有提到 remove 方法,但是 remove 方法的文档 确保顺序被保留。retainAll 的文档 表示它“删除”元素,这对我来说意味着相同的删除行为:即保持顺序。 - VGR
2个回答

3

为了参考,假设调用如下:

list.retainAll(coll)

否则,鉴于list是正在修改的集合,并且是指定顺序的集合,问题就毫无意义了。
Java集合方法retainAll()是否保证不改变修改的列表的顺序?
规范明确说明它从coll中删除不在list中的元素,因此顺序的问题取决于是否指定了remove方法以保留顺序。
由于您说了:“保留列表的顺序”,那么答案是:是
但如果list不是List而是其他一些集合类型,则答案为否,因为并非所有集合类型都保证有序。
使用retainAll()的集合对象可能会有所不同吗?
由于list是正在使用该方法的对象,因此答案是:不会
嗯,假设它是一个List,但这已经被回答过了。
如果你想提到coll作为“正在使用方法”的一个对象,那么答案是:不会
然而,性能受coll的集合类型影响,因为实现使用coll.contains()来检查匹配项,因此如果coll是一个Set,则可以获得更好的性能。

0

1) 方法retainAll()定义在接口Collection中,而不是List中。在集合中基本上没有顺序。例如,Set是一个集合,并且也有这个方法。但是在Set中没有顺序(除非您使用一些非常特殊的Set实现)。顺序仅针对List定义。这就是为什么您的问题只对List有意义,而不适用于一般的Collection

2) 如果我们指的是List:如果在List上调用retainAll,规范不要求保留元素的顺序。JLS的定义非常模糊:JLS说List是“一个有序的集合...用户可以通过它们的整数索引访问元素”。但是在任何操作期间都没有提到保留顺序。我实际上希望顺序应该被保留,但是JLS并不要求这样做。这就是为什么从正式上讲,您甚至不应该期望列表中的顺序会被保留。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接