Java缓存多个映射中的对象与一个列表

时间:2015-08-03 12:29:04

标签: java caching hashmap

我目前正在列表List<CachedObject>中缓存数据库对象。 CachedObject看起来像这样:

class CachedObject
{
    private int id;
    private int id_type;
    private int id_other_type;

    // getters and setters
}

我目前正在使用此函数从缓存中获取对象

    public CachedObject getCachedObjectById( Integer id )
    {
        for ( CachedObject cachedObject : cachedObjectList )
            if( id.equals(cachedObject.getId() ) )
                return cachedObject;

        return null;
    }

    public List<CachedObject> getCachedObjectByIdType( Integer idType )
    {
        List<CachedObject> cachedObjectList = new ArrayList<CachedObject>();

        for ( CachedObject cachedObject : this.cachedObjectList )
            if( idType.equals(cachedObject.getIdType() ) )
                cachedObjectList.add(cachedObject);

        return cachedObjectList;
    }

由于这样做很多,加载缓存以在单独的地图中分发信息(在这种情况下为3)时会更快:

Map<Integer, CachedObject> cachedObject_to_id
Map<Integer, List<CachedObject>> cachedObjectList_to_idType
Map<Integer, List<CachedObject>> cachedObjectList_to_idOtherType

当获取对象时,只需从地图中获取。

修改

任何不同时间的缓存对象数为20 - 500。

1 个答案:

答案 0 :(得分:1)

访问哈希表通常比使用顺序扫描方法更快。但如果只检查几个值(低于10),则无关紧要。

备注:方法getCachedObjectByIdType返回一个可变列表。如果客户端代码不在您的控制之下,您可以将其转换为不可变列表。

我稍微倾向于使用地图。原因:

  • 访问速度会更快
  • 访问时间保持不变,并且在有更多数据进入时不会发生变化
  • 访问不需要对象分配。您需要一个用于迭代器,一个用于数组列表。也许是将其转换为不可变列表的另一个。

但代码变得更复杂。当您在最坏的情况下必须扫描500个对象时,这意味着,通过使用哈希映射,您的代码可以快两个数量级。但是,这可能对应用程序没有影响。要问的问题:

  • 这些对象的访问频率是多少?它是非常重要的东西,经常被访问吗?
  • 我是否真的想用500个元素进行额外测试,以检查所有性能是否可以接受?
  • 我需要多久更新一次缓存并重建数据结构?
  • 完全构建地图还是使用延迟加载?
  • 我该如何解决并发问题?是否有地图的并发修改,还是只读?
相关问题