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

Java集合方法retainAll()是否保证其修改的列表顺序不变?,java,collections,Java,Collections,它能否取决于哪个集合对象正在使用retainAll?我正在使用字符串列表 我已经搜索了很多,在这里和网上的其他地方我发现了一些提示,它应该保持列表的顺序不变,但没有明确的直接答案。如果已经回答了,请给我指出正确的方向 我甚至找到了实现retainAll函数的代码示例,这些代码示例表明没有触及订单。但据我所知,这些示例可能并不完全是下载的java包中标准方法的编码方式。从我自己的测试中,使用该方法似乎也表明它保持有序。但我想更确定一点,因为我正在做的测试特别依赖于列表的有序性 确切地说,我希望这个

它能否取决于哪个集合对象正在使用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
}
/**
*此函数获取预期列表并验证它是否按预期顺序包含在实际列表中
*@param expectedList{@link List}按应通过标准的顺序排列
*@param actualList{@link List}按产品中存在的顺序排列
*当expectedList在actualList中的顺序正确时,@return{@link Boolean}返回true
*/
静态布尔验证顺序(列表expectedList、列表actualList)
{
布尔有序=假
如果(expectedList==actualList)
有序=真
其他的
{
实际列表保留(预期列表)
如果(actualList==expectedList)
有序=真
}
订购退货
}

为便于参考,假设调用为:

list.retainAll(coll)
否则,如果
list
是正在修改的集合,并且是具有指定顺序的集合,那么这个问题就没有意义了

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

规范明确指出,它从
列表
中删除了不在
coll
中的元素,因此顺序问题取决于是否指定了
删除
方法来保留顺序

既然你说“保留列表的顺序”,那么答案是:是的

但您也将其表述为“是Java集合方法retainal()”,因此如果
list
不是一个
list
而是其他集合类型,那么答案是否定的,因为并非所有集合类型都保证顺序

它能否取决于哪个集合对象正在使用retainAll

由于
列表
是使用该方法的列表,因此:否
好吧,假设它是一个
列表
,但这已经得到了回答

如果您想将
coll
称为“使用该方法的人”,则:否
但是,性能会受到
coll
集合类型的影响,因为实现使用
coll.contains()
检查匹配项,因此如果
coll
集合

1)方法
retainal()
在接口
集合
中定义,不在
列表中
。在集合中基本上没有顺序。例如,
Set
是一个集合,也有这个方法。但是
集合
中没有顺序(除非您使用
集合
的一些非常特殊的实现)。订单仅为
列表定义。这就是为什么你的问题只适用于
列表
,而不适用于
集合


2) 如果我们的意思是
List
:如果在
List
上调用
retainal
,则规范不要求保留元素的顺序。JLS的定义非常模糊:JLS说列表是一个有序的集合。。。用户可以通过其整数索引访问元素。但在任何操纵过程中都没有关于保持秩序的说法。事实上,我希望保留订单,但联合联络小组并不要求这样做。这就是为什么在形式上你不应该期望列表中的顺序会被保留。

Iff这不仅仅是伪代码:
==
比较没有意义。您应该将对象与
相等的对象进行比较。
列表
保证它将保持其元素的顺序。虽然
retainAll
的合同没有提到
remove
方法,但它确实保证了订单的保留。表示它“删除”元素,这对我来说意味着相同的删除行为:即,保留顺序。