【问题标题】:Is javaHashmap completely indexed?javaHashmap 是否完全索引?
【发布时间】:2018-06-06 03:00:18
【问题描述】:

我们正在使用 javaHashmap 来缓存所有 TIBCO 应用程序中的数据库表。我想知道JavaHashmap是否真的被索引或者有没有更好的方法来缓存Java中的数据库表(不能添加新框架)

public class WrapConvTableInfo {

    private static HashMap<String, WrapConvTableInfo_Entry> _wrapConvMap;


public WrapConvTableInfo() {

    _wrapConvMap = new HashMap<String, WrapConvTableInfo_Entry>();
}

以上是代码sn-p,供参考。

【问题讨论】:

  • 是的,它已被索引; HashMap.
  • “真正被索引”是什么意思?您的示例通过 String 键索引 WrapConvTableInfo_Entry 对象。
  • 我不是Java专家,所以你是说Hashmap是通过默认索引的String key来索引的??我们将缓存数千条记录
  • @AbdulKader 如果键是字符串(如您的 HashMap&lt;String, WrapConvTableInfo_Entry&gt; 示例中),那么是的,它由字符串键索引。
  • @Eran 有更好的方法吗??

标签: java caching indexing hashmap


【解决方案1】:

HashMap 是键值对存储而不是表。这里没有索引的概念,就像数据库中的表一样;它基于散列键工作。

每个HashMap 都包含一个叫做桶的东西。键被散列,散列值除以桶数。余数是你的价值所在的桶号。

例如,假设我的 HashMap 有 16 个桶。

现在,如果我假设我将键值对 &lt;foo,bar&gt; 插入到我的 HashMap 中。

  • 首先计算foo 的哈希值。就本示例而言,假设返回的哈希值为 61。
  • 现在 61 % 16(余数)是 1。所以你的值进入第一个桶。
  • 因此,所有被插入的值都被分成这样的桶。如果您的散列函数很好,那么所有存储桶应该或多或少具有相同的值。

从 HashMap 中获取值

  • 首先计算foo 的哈希值和桶号,类似于插入。
  • 现在必须在仅存在于存储桶中的键值对中搜索您的值。所以这样可以节省时间。在 Java 8 中,如果存储桶的值超过 8 个,则存储桶会以树的形式存储值以便更快地访问。

如果您使用HashMap 进行缓存,您需要花一些时间来处理它最初应该有多大?您的HashMap 何时应该增长 (loadFactor) 和桶的数量应该有少量的桶将导致太多的值无法搜索。另一方面,太多的桶会导致 CPU 上的 L1 缓存浪费。此外,如果你的应用程序是多线程的,HashMap 不是线程安全的,你最终会得到一个损坏的缓存。在这种情况下,您需要使用ConcurrentHashMap

【讨论】:

    猜你喜欢
    • 2011-06-28
    • 2012-07-29
    • 2010-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多