Kri*_*ant -5 java collections comparison java-6
我如何从另一个中得到List<Object> filteredList id(Object.id)包含的内容.考虑到适度的数据量,在解决这个问题的时候,有效和高效的方法是什么.List<id> idsListList<Object>allObjects
我正在使用java6
我不想多次迭代这两个列表
为什么?过早优化是一件坏事.首先测试它,测量它是否足够有效,并解决问题(如果存在).
您可以使用简单的过滤器来完成此操作:
class Student
{
long id;
}
final List<Student> students = /*something*/;
final List<Long> rollNoList = /*something*/;
List<Student> newStudents = students.stream()
.filter(student -> rollNoList.contains(student.id))
.collect(Collectors.toList());
Run Code Online (Sandbox Code Playgroud)
使用流进行此操作的优点是您可以稍后将其并行化.
另一个优化是检查您对数据结构的使用.正如Seelenvirtuose指出的那样,使用像a这样的东西HashSet会降低contains从O(n)到O(1)的复杂性:
final Set<Long> rollNoList = new HashSet<>();
Run Code Online (Sandbox Code Playgroud)
如果你不能这样做,你可能会看到一些性能提升,以增加内存使用为代价,通过复制List到HashSet过滤之前:
final Set<Long> rollNumbers = new HashSet<>(rollNoList);
Run Code Online (Sandbox Code Playgroud)
但如果您可以控制数据结构,只需HashSet从头开始使用即可.