执行最快的搜索 - 我应该使用哪个集合?

时间:2015-05-19 09:04:11

标签: java search collections time-complexity

我知道:

  • 如果您需要使用索引快速访问元素,则应选择ArrayList。
  • 如果您需要使用密钥快速访问元素,请使用HashMap。
  • 如果您需要快速添加和删除元素,请使用LinkedList(但它的搜索性能非常差)。

为了执行最快速的搜索,根据存储在集合对象中的数据,我应该使用哪个集合?

以下是我的代码:

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

3 个答案:

答案 0 :(得分:11)

比较ArrayListLinkedList时经常跳过的事情是缓存和内存管理优化。 ArrayList实际上只是一个数组,这意味着它存储在内存中的连续空间中。这允许操作系统使用优化,例如“当访问内存中的字节时,很可能很快就会访问下一个字节”。因此,除了一种情况外,ArrayListLinkedList更快:在列表的开头插入/删除元素时(因为数组中的所有元素都必须移位)。在ArrayList的情况下,在末尾或中间添加/删除,迭代,访问元素都会更快。

如果您需要搜索名称 ID的学生,则听起来像是带有复合键的地图 - Map<Student, StudentData>。我建议使用HashMap实现,除非您需要能够搜索集合并检索按键排序的所有元素,在这种情况下TreeMap可能是更好的主意。虽然请记住HashMapO(1)访问时间,而TreeMapO(logn)访问时间。

我不太确定你想要实现的目标 - 为什么要搜索这个系列呢?你想在那里找到什么?

答案 1 :(得分:1)

在给定限制的情况下,您应该使用HashMap。 它会为您提供快速搜索,如您所愿。

如果您关心按特定顺序遍历元素,则应选择TreeMap(自然顺序)或LinkedHashMap(插入顺序)。

如果您的集合保证不可变,您可以使用带有二进制搜索的排序ArrayList,它将为您节省一些内存。在这种情况下,您只能搜索一个特定的密钥,这在许多实际应用程序中都是不受欢迎的。

无论如何,你应该有非常巨大数量的元素(数百万/十亿)来感受O(logN)解决方案和O(1)解决方案之间的区别。

如果您想了解有关数据结构的更多信息,我建议您在coursera.com上查看普林斯顿大学的Algorythms课程

答案 2 :(得分:0)

保持多个集合更快地访问数据没有任何问题。

在这种情况下,我会使用2 HashMap<String, Student>。每个搜索键一个。

(PS:或者如果您不知道使用哪种关键字进行搜索,那么您可以将它们存储在同一个地图中)。