javaHashmap是否完全索引?

时间:2017-12-24 07:08:51

标签: java caching indexing hashmap

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

public class WrapConvTableInfo {

    private static HashMap<String, WrapConvTableInfo_Entry> _wrapConvMap;


public WrapConvTableInfo() {

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

以上是供参考的代码段。

1 个答案:

答案 0 :(得分:1)

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

每个HashMap都包含一些名为buckets的内容。对键进行散列,并将散列值除以桶的数量。余数是您的值所在的桶号。

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

现在,如果我假设我将一个键值对<foo,bar>插入我的HashMap

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

从HashMap中获取值

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

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