【问题标题】:Fastest and most efficient way of searching a key-value pair in Java?在 Java 中搜索键值对的最快和最有效的方法?
【发布时间】:2011-03-05 08:13:04
【问题描述】:

免责声明:
这个问题不是用来争论的!

搜索键值对的最快且内存消耗更少的方法是什么?我将把项目存储在一个键值之类的关系中,我需要快速访问它们。我应该使用 SQLite 数据库吗?一张地图?哈希表?哈希表?请给出使用任何搜索方法的一些优点/缺点。

【问题讨论】:

    标签: java search key-value


    【解决方案1】:

    只要您的密钥hash function 有效,任何基于哈希的Map 结构都是可行的。您可以使用值 id:s 作为查找的结果,以在搜索期间节省内存。

    如果您的数据已经在数据库中,那么您可以将此搜索完全留给 RDBMS,毕竟它们是为这些东西而设计的。

    【讨论】:

      【解决方案2】:

      如果你的数据在内存中,Maps 通常是你的朋友——他们就是为此而生的。

      但是不要使用Hashtable。它比较新的 Map 实现慢得多。因为它的方法是同步的,大多数时候不需要(并且在需要时,有一个更好的选择 - 见下文)。

      在单线程上下文中,HashMap 可能会没问题。

      如果您需要线程安全,请使用ConcurrentHashMap

      【讨论】:

      • HashTable 在单线程环境中不同步且比 ConcurrentHashMap 更快,但它没有任何锁定!如果访问map是多线程的,ConcurrentHashMap确实是最好的解决方案。
      • @Tobias,“与新的集合实现不同,Hashtable 是同步的” - 来自java.sun.com/j2se/1.5.0/docs/api/java/util/Hashtable.html
      • 既然我们在谈论语义... "ConcurrentHashMap 实现几乎在所有情况下都比HashMap 执行得更好。它还允许同时并发读取和写入,并且它具有支持常见的方法否则不是线程安全的复合操作。如果 Java 5 是部署环境,请以 ConcurrentHashMap 开头。” 清洁代码 - 敏捷软件工艺手册,Robert C. Martin,第 183 页
      • @Esko,很好的发现,我不记得了 :-) 但是,差异似乎可以忽略不计。 Java 泛型和集合 说,ch。 16.4.1:“忽略刚刚描述的锁定开销,ConcurrentHashMap 的操作成本与HashMap 的操作成本相似”。它建议将HashMap 用于单线程。
      • 对,我说的是 HashMap 而不是 HashTable,它也不是同步的,因此是单线程环境的最佳解决方案。如果不需要锁定,Java Concurrency in Practice 也建议使用非锁定集合。
      猜你喜欢
      • 2011-02-23
      • 2014-10-03
      • 2017-03-17
      • 2018-10-13
      • 1970-01-01
      • 1970-01-01
      • 2019-08-24
      • 1970-01-01
      • 2017-10-18
      相关资源
      最近更新 更多