目前在我的遗留代码中,我已经以列表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;
}
我以前没有这样做过,因为我真的不知道这个地图缓存的缺点,而且首先这样做并不傻。
答案 0 :(得分:2)
好HashMap.values()
直接返回一个Collection。没有完成计算或数据复制。它尽可能快。
因此,以HashMap的形式进行缓存是您的理由。
但考虑在任何情况下,如果您的代码中需要List<CachedObject>
ArrayList<CachedObject> list = new ArrayList<CachedObject>(hashMap.values());
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中的所有值)更有效。