在Java中,从两个字符串数组返回公共(public)元素的最有效方法是什么?我可以使用一对for循环来做到这一点,但这似乎并不是很有效。根据我对similar SO question的评论,我能想到的最好的方法是转换为List
,然后应用retainAll
:
List<String> compareList = Arrays.asList(strArr1);
List<String> baseList = Arrays.asList(strArr2);
baseList.retainAll(compareList);
最佳答案
编辑:
这是单线的:
compareList.retainAll(new HashSet<String>(baseList));
retainAll
impl(在AbstractCollection中)迭代this
,并在参数上使用contains()
。将参数转换为HashSet
将导致快速查找,因此retainAll
中的循环将尽快执行。另外,名称
baseList
暗示它是一个常量,因此,如果缓存此常量,则可以显着提高性能:static final Set<String> BASE = Collections.unmodifiableSet(new HashSet<String>(Arrays.asList("one", "two", "three", "etc")));
static void retainCommonWithBase(Collection<String> strings) {
strings.retainAll(BASE);
}
如果要保留原始列表,请执行以下操作:static List<String> retainCommonWithBase(List<String> strings) {
List<String> result = new ArrayList<String>(strings);
result.retainAll(BASE);
return result;
}