映射与列表中的Java缓存

时间:2015-08-03 09:50:18

标签: java caching

目前在我的遗留代码中,我已经以列表List<CachedObject>的形式缓存了一些数据库信息。

CachedObject看起来像这样

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

       // getters and setters
    }

大部分时间我通过函数获取一个特定对象:

public CachedObject getById( Integer id )
    {
        if( id != null )
            for ( CachedObject cachedObject : this.cachedObjectList )
                if( cachedObject.getId().equals( id ) )
                    return cachedObject;

        return null;

    }

我的问题是,将Map<Integer, CachedObject>中的对象缓存为id是否更好。我在这种情况下的担忧是,我列表中的其他 getter必须如下所示:

    public CachedObject getByIdType( Integer id )
    {
        if( id != null )
            for ( CachedObject cachedObject : cachedObjectList.values() )
                if( cachedObject.getId().equals( id ) )
                    return cachedObject;

        return null;

    }

我以前没有这样做过,因为我真的不知道这个地图缓存的缺点,而且首先这样做并不傻。

2 个答案:

答案 0 :(得分:2)

HashMap.values()直接返回一个Collection。没有完成计算或数据复制。它尽可能快。

因此,以HashMap的形式进行缓存是您的理由。

考虑在任何情况下,如果您的代码中需要List<CachedObject>

ArrayList<CachedObject> list = new ArrayList<CachedObject>(hashMap.values());
ArrayList,valuesList调用集合hashMap toArray()方法,该方法基本上从集合中的0..N(size)元素执行for循环。

答案 1 :(得分:0)

如果使用Map,则不需要循环。您的代码可以简化为:

public CachedObject getByIdType( Integer id )
{
    if( id != null )
        return cachedObjectList.get(id);     
    else
        return null;
}

这比迭代List中的所有元素(或Map中的所有值)更有效。