方法一:
arr1.retainAll(arr2)
方法二:
List<String> arr1;
List<String> arr2 ;
for(String s: arr2){
if(arr1.contains(s))
arr1.remove(s);
}
我个人认为 1 表现力和性能效率更高。如果 arr1 不等于 arr2,JDK 使用System.arraycopy()
完整复制arr2
到arr1
而不是删除单个元素。System.arraycopy 是原生实现的,速度非常快。
以下是执行此操作的 JDK 代码的参考。
private boolean batchRemove(Collection<?> c, boolean complement) {
final Object[] elementData = this.elementData;
int r = 0, w = 0;
boolean modified = false;
try {
for (; r < size; r++)
if (c.contains(elementData[r]) == complement)
elementData[w++] = elementData[r];
} finally {
// Preserve behavioral compatibility with AbstractCollection,
// even if c.contains() throws.
if (r != size) {
System.arraycopy(elementData, r,
elementData, w,
size - r);
w += size - r;
}
if (w != size) {
for (int i = w; i < size; i++)
elementData[i] = null;
modCount += size - w;
size = w;
modified = true;
}
}
return modified;
}
如果只有很少的元素会有所不同,那么方法 2 会更好。