哪个有更好的表现?在ArrayList中添加或复制和删除?

时间:2014-11-25 14:38:59

标签: android performance arraylist

我的android设备上有数以千计的记录SQLite数据库,我需要从它们快速构建一个ArrayList来查看一些记录。那么哪一个更快?

            List<Items> values = database.getAllItems();
            List<Items> valuesBuffer = new ArrayList<Items>();
            for (Items item : values) {
                if ((item.getItemToScan() == 1) && 
                                 (item.getItemScanned() != item.getItemAmount()))
                {
                    valuesBuffer.add(item);
                }
            }

或者

            List<Items> values = database.getAllItems();
            List<Items> valuesBuffer = new ArrayList<Items>(values);
            for (Items item : values) {
                if ((item.getItemToScan() != 1) || 
                                 (item.getItemScanned() == item.getItemAmount()))
                {
                    valuesBuffer.remove(item);
                }
            }

也可能检查或(||)逻辑平均花费更多时间......

2 个答案:

答案 0 :(得分:1)

我认为这个问题没有明确的答案。但是如果你对这些值有一些了解,你可以做一些优化。

如果您希望删除(或在第一种情况下添加)大多数元素,那么更好的解决方案是使用方法一,因为您不会执行多次删除。如果你希望删除一些元素,最好使用第二种方法,因为复制数组比逐个添加元素便宜。

答案 1 :(得分:1)

第一个。

因为remove无论如何都是o(n)操作(在这种情况下,因为/你需要找到项目的索引而b /你需要将所有项目向下移动一行),复杂性为o(n^2)

第一个的复杂性是摊销o(n),并且通过初始化足够大小的arraylist可以是o(n) new ArrayList<Items>(values.size());

修改

所有这些都取决于过滤掉的项目数量。如果已知该数字与常数有关,则在两种情况下复杂度都变为o(n)。如果不知道,上面的答案就是。