从两个字符串数组返回公共元素的最有效方法

JW8*_*JW8 10 java arrays compare

在Java中,从两个String Arrays返回公共元素的最有效方法是什么?我可以用一对for循环来做,但这似乎不是非常有效.根据我对类似SO问题的回顾,我能想出的最好的是转换为a List然后应用:retainAll

List<String> compareList = Arrays.asList(strArr1);
List<String> baseList = Arrays.asList(strArr2);
baseList.retainAll(compareList);
Run Code Online (Sandbox Code Playgroud)

Boh*_*ian 5

编辑:

这是一个单行:

compareList.retainAll(new HashSet<String>(baseList));
Run Code Online (Sandbox Code Playgroud)

retainAllIMPL(类AbstractCollection中)遍历this,并使用contains()该参数.将参数转换为a 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);
}
Run Code Online (Sandbox Code Playgroud)

如果要保留原始列表,请执行以下操作:

static List<String> retainCommonWithBase(List<String> strings) {
   List<String> result = new ArrayList<String>(strings);
   result.retainAll(BASE);
   return result;
}
Run Code Online (Sandbox Code Playgroud)