我知道:
为了执行最快速的搜索,根据存储在集合对象中的数据,我应该使用哪个集合?
以下是我的代码:
public void fillAndSearch(Collection<Student> collection) {
if(collection!=null){
for (int i=0; i<=10; i++) {
Student student = new Student("name" + i, "id" + i);
collection.add(student);
}
}
//here We have to perform searching for "name7" or "id5",
//then which implementation of collection will be fastest?
}
class Student {
String name;
String id;
Student(String name, String id) {
this.name = name;
this.id = id;
}
}
答案 0 :(得分:11)
比较ArrayList
和LinkedList
时经常跳过的事情是缓存和内存管理优化。 ArrayList
实际上只是一个数组,这意味着它存储在内存中的连续空间中。这允许操作系统使用优化,例如“当访问内存中的字节时,很可能很快就会访问下一个字节”。因此,除了一种情况外,ArrayList
比LinkedList
更快:在列表的开头插入/删除元素时(因为数组中的所有元素都必须移位)。在ArrayList
的情况下,在末尾或中间添加/删除,迭代,访问元素都会更快。
如果您需要搜索名称和 ID的学生,则听起来像是带有复合键的地图 - Map<Student, StudentData>
。我建议使用HashMap
实现,除非您需要能够搜索集合并检索按键排序的所有元素,在这种情况下TreeMap
可能是更好的主意。虽然请记住HashMap
有O(1)
访问时间,而TreeMap
有O(logn)
访问时间。
我不太确定你想要实现的目标 - 为什么要搜索这个系列呢?你想在那里找到什么?
答案 1 :(得分:1)
在给定限制的情况下,您应该使用HashMap。 它会为您提供快速搜索,如您所愿。
如果您关心按特定顺序遍历元素,则应选择TreeMap(自然顺序)或LinkedHashMap(插入顺序)。
如果您的集合保证不可变,您可以使用带有二进制搜索的排序ArrayList,它将为您节省一些内存。在这种情况下,您只能搜索一个特定的密钥,这在许多实际应用程序中都是不受欢迎的。
无论如何,你应该有非常巨大数量的元素(数百万/十亿)来感受O(logN)解决方案和O(1)解决方案之间的区别。
如果您想了解有关数据结构的更多信息,我建议您在coursera.com上查看普林斯顿大学的Algorythms课程
答案 2 :(得分:0)
保持多个集合更快地访问数据没有任何问题。
在这种情况下,我会使用2 HashMap<String, Student>
。每个搜索键一个。
(PS:或者如果您不知道使用哪种关键字进行搜索,那么您可以将它们存储在同一个地图中)。