removeAll(Collection c) 从调用集合中删除 c 中的所有对象。
retainAll(Collection c) 在仅调用 c.(intersection) 中的那些对象的集合中将保留
我的问题是,它们的工作方式是否相同?由于 retainAll 必须删除不常见的元素,并且 removeAll 执行上面设置的操作
removeAll(Collection c) 从调用集合中删除 c 中的所有对象。
retainAll(Collection c) 在仅调用 c.(intersection) 中的那些对象的集合中将保留
我的问题是,它们的工作方式是否相同?由于 retainAll 必须删除不常见的元素,并且 removeAll 执行上面设置的操作
Collection#removeAll
不再神秘,从一个集合中删除包含在另一个集合中的所有项目。有了Collection#retainAll
更多的好奇。此接口中的方法和其他方法都依赖equals
和方法hashCode
进行比较。当您执行时,它将retainAll
通过 比较两个列表的元素equals
,如果找不到,则通过引用进行比较。这就是为什么equals
如果要使用此方法,覆盖很重要的原因。因此,它具有完全相反的操作。一个删除共同元素,而另一个保留共同元素。
简单的回答:是的。但当然,这将取决于具体的类(例如 ArrayList)和具体的实现。
两种方法都依赖于方法
contains
,indexOf
然后equals
依赖于包含对象的方法equals
,因此算法实际上相同但条件不同是有意义的。在这里,您有 ArrayList 的实现(Open JDK)的来源,您可以在其中验证我所说的。如果你仔细观察,你会发现这两个方法都调用了第三个被调用的方法
batchRemove
,它实现了算法但改变了条件。问候。