在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;
}

10-06 13:35