gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 11:16:21 26 4
gpt4 key购买 nike

我当前正在列表 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;
}

由于这已经完成了很多,当加载缓存以在单独的 map 中分发信息时(本例中为 3),是否会更快:

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

获取对象时,只需从 map 中获取即可。

编辑:

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

最佳答案

访问哈希表通常比使用顺序扫描方法更快。但如果只是检查几个值(10 以下),那就没关系。

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

在你的情况下我稍微倾向于使用 map 。原因:

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

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

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

关于Java 在多个映射与一个列表中缓存对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31787298/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com