Map.clear()vs new Map:哪一个会更好?

时间:2011-07-20 06:31:43

标签: java android performance collections

我的地图语法为Map<String, String> testMap = new HashMap<String, String>();。 在此地图中可以有1000个数据。

当我的应用程序需要新的数据列表时,我必须清除Map。但是当我看到Map.clear()的代码为

/**
     * Removes all of the mappings from this map.
     * The map will be empty after this call returns.
     */
    public void clear() {
        modCount++;
        Entry[] tab = table;
        for (int i = 0; i < tab.length; i++)
            tab[i] = null;
        size = 0;
    }

我意识到clear方法循环n次(其中n是Map中的数据数)。所以我认为有一种方法可以将地图重新​​定义为testMap = new HashMap<String, String>(); 以前使用的Map将被收集垃圾。

但我不确定这会是一个好方法。我正在研究移动应用程序。

你能指导我吗?

7 个答案:

答案 0 :(得分:93)

复杂的问题。让我们看看会发生什么。

您实例化一个新实例,该实例由新数组支持。因此,垃圾收集器应清除前一个映射中的所有键和值,并清除对自身的引用。所以O(n)算法无论如何都要执行,但是在垃圾收集器线程中。对于1000条记录,您将看不到任何差异。 但。性能guide告诉您最好不要创建新对象,如果可以的话。所以我会选择clear()方法。

无论如何,尝试两种变体并尝试测量。总是测量!

答案 1 :(得分:20)

在大小为Map.clear()的地图上说n时...您要求GC清理2*n(Key&amp; Value)对象。当您对同一个地图说null时,您要求GC清理2*n+1(地图本身为1)对象。然后,您将不得不创建一个新的Map实例,这是另一个开销。所以去Map.clear()。在实例化时,最好预设Map的大小。

答案 2 :(得分:9)

我认为在java中创建对象在内存方面更加昂贵,所以最好使用.clear(),所以你使用相同的对象而不是创建新对象

答案 3 :(得分:5)

使用clear()方法的想法是从地图中删除对其他对象的引用,这样如果“地图被引用到其他地方”,则键/值不会因为gcing而被阻止。

但是如果您的地图是仅由您的特定代码使用的本地地图(即“地图”未在其他地方引用“),那么继续使用新地图,但设置1000引用为null将不会是无论如何都会有很大的表现。

答案 4 :(得分:1)

将删除所有数据的map.clear()。请注意,这只会丢弃所有条目,但保留用于存储相同大小的条目的内部数组(而不是缩小到初始容量)。如果你还需要消除它,最简单的方法是丢弃整个HashMap并用新实例替换它。当然,只有在您控制谁有指向地图的指针时才有效。

至于回收内存,你必须让垃圾收集器完成它的工作。

你的价值观也很长吗?在这种情况下,您可能希望查看比通用HashMap更高(内存)效率的实现,例如GNU Trove library中的TLongLongHashMap。这应该可以节省大量内存。

答案 5 :(得分:1)

我认为调用新的HashMap()是一个更好的主意,因为它不需要像清除hashmap那样进行多少处理。此外,通过创建新的散列映射,您将删除散列映射可能仍然绑定到使用数据的控件的可能性,这将在清除散列映射时导致问题。

答案 6 :(得分:1)

不要忘记地图的重新填充

如果你没有在新地图上指定容量,你将在新创建的地图上获得相当多的开销,因为重新加入(每个都是O(n)(当时)并且发生O(log( n))这可能会分摊到O(n)总数,但如果它们首先没有发生,你仍然会更好)

清除地图不会发生这种情况,因为容量不会改变