我构建了一个非常慢的对象列表,我需要提高构建列表的速度。添加到列表中的对象本身具有多个子对象,通常为 3 个对象,根据剩余要添加的数据量更改为 2 或 1。我打算构建一个子对象数据 bean,因为传递的参数大部分相同,只有子对象发生变化。我相信有一种比我列出清单的方式更有效的方法。这是我现在的代码:List<MainObject> list = new ArrayList();List<Data> dataList = getDataList();MainObject mainObject;int limit = 100;for(int i = 0; i < limit; i += 3) { if(i == limit - 1) { list.add(mainObject = new MainObject(new SubObject(dataList.get(i), this, bBool, tabs))); }else if(i == limit - 2) { list.add(mainObject = new MainObject(new SubObject(dataList.get(i), this, bBool, tabs), new SubObject(dataList.get(i +1), this, bBool, tabs))); }else { list.add(mainObject = new MainObject(new SubObject(dataList.get(i), this, bBool, tabs), new SubObject(dataList.get(i +1), this, bBool, tabs), new SubObject(dataList.get(i +2), this, bBool, tabs))); }}return list;参数“this、bBool、tabs”都是类变量并且始终相同。我确实知道最后一个 else 条件在大多数情况下都会运行,因此这可能应该是 if 语句中的第一个条件,但我宁愿找到一种更好的方法来一起构建列表。
3 回答

德玛西亚99
TA贡献1770条经验 获得超3个赞
检查 getDataList() 返回的列表类型;对于您的用例来说,它必须是 ArrayList - 如果它是 Linkedlist,则获取索引调用会很繁重且耗时
将 limit-1 和 limit-2 情况移出 for 循环并退出循环 limit-2 本身。

哆啦的时光机
TA贡献1779条经验 获得超6个赞
您不需要将新的 MainObject 分配给变量
将 MainObjects 列表更改为 LinkedList。添加操作对于 LinkedList 来说更有效,因为 ArrayList 必须在数组满时重建数组 - 它非常耗时(或者只是创建具有限制大小的 ArrayList:new ArrayList<>(limit);)
getDataList() 方法应返回 LinkedList

慕尼黑8549860
TA贡献1818条经验 获得超11个赞
对于您的limit = 100
,显示的代码中没有任何内容可能会很慢。您当然可以进行一些低级优化,如 Srini 提出的(“将 limit-1 和 limit-2 情况移到外部”),但罪魁祸首在其他地方:要么在构造函数中,要么在dataList::get
.
作为一个快速技巧,请dataList = new ArrayList<>(dataList)
在循环之前尝试。
添加回答
举报
0/150
提交
取消