gpt4 book ai didi

java - 从 HashMap 返回 List 还是将 List 保留在内存中更好?

转载 作者:行者123 更新时间:2023-12-02 11:16:48 25 4
gpt4 key购买 nike

我看到很多从 HashMap 返回列表的结果,所以没有问题,但我很想知道在下面的场景中始终执行此操作与将对象本身保留在列表中是否是更好的选择。

我有一堆 Widget 对象(在单例类 id 中有一个 UUID ( title )、一个 String ( priority ) 和一个 int ( WidgetStore ))。我将使用它们来填充 RecyclerViewFragment 想要一个 View 列表,但我也有一个通过 id 返回单个小部件的方法。要将小部件保留在列表中意味着我必须循环遍历它们,寻找具有给定 id 的小部件,因此我认为将它们放在 HashMap<UUID, Widget> 中要快得多。不仅通过 id 查找速度很快,而且当被询问时我也可以只返回列表 object 。这或多或少是最佳的?有什么办法可以让我自己找到答案而不打扰你吗? (问题是为了我自己的个人启发,我试图在这里更好地了解内部工作原理。)

这是 WidgetStore 的类:

public class WidgetStore {
private static WidgetStore sWidgetStore;
// private final List<Widget> mWidgets; // Use hashmap instead, better?
private final HashMap<UUID, Widget> mIdMap = new HashMap<>();

public static WidgetStore get(Context context) {
// Singleton: if one exists, return it; otherwise, create it
if (sWidgetStore == null) {
sWidgetStore = new WidgetStore(context);
}
return sWidgetStore;
}

private WidgetStore(Context context) {
// Singleton: only access this class with get()

// mWidgets = new ArrayList<>(); // Use hashmap instead

// Widget factory
for (int i = 0; i < 10000; i++) {
Widget widget = new Widget();
widget.setTitle("Widget #" + i);
widget.setPriority((int) (Math.random() * 100d) % 3); // Random-ish-ly
// mWidgets.add(widget); // Use hasmap instead
mIdMap.put(widget.getId(), widget);
}
}

public List<Widget> getWidgets() {
// TODO find out if faster to always create new list from hashmap or
// also keep a list around in memory (seems fast on good hardware...)
List<Widget> list = new ArrayList<>(mIdMap.values());
return list;
}

public Widget getWidget(UUID id) {
Widget widget = mIdMap.get(id);
if (widget == null) {
return null;
}
return widget;
}
}

最佳答案

传统上,您不应该太担心优化代码,直到开发后期您意识到存在性能问题。但是,如果您正在学习想要了解更多有关更优化选项的信息,是的,它听起来像 HashMap 或类似的 Map。

拥有一个以列表形式获取值的方法可能会有所帮助,具体取决于您是否知道所需小部件的 ID,或者您是否需要检查小部件的某些其他属性来识别它。

就您自己进行分析而言,有几种方法。您可以使用 System.currentTimeMillis() 添加一些手动 Log 语句,如下所示:

long now = System.currentTimeMillis();
Widget widget = widgetStore.get(id);
long duration = System.currentTimeMillis() - now;
Log.i("WidgetStorePerformance", duration);

这是技术含量较低的解决方案。您还可以考虑将 Trace 方法调用添加到您想要分析的 WidgetStore 代码中。

public Widget getWidget(UUID id) {
Trace.beginSection("WidgetStore");
Widget widget = mIdMap.get(id);
if (widget == null) {
return null;
}

Trace.endSection();
return widget;
}

然后使用 this tool

关于java - 从 HashMap 返回 List 还是将 List 保留在内存中更好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50214829/

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