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

Pan*_*mar 90 java collections performance android

我有一个Map作为语法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;
    }
Run Code Online (Sandbox Code Playgroud)

我意识到clear方法循环n次(其中n是Map中的数据).所以我认为可以有一种方法来重新定义Map,因为testMap = new HashMap<String, String>(); 之前使用的Map将是Garbage收集的.

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

你能指导我吗?

Vla*_*nov 95

复杂的问题.让我们看看发生了什么.

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

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

  • +1 阅读指南后,我意识到我的困惑之处。谢谢你。 (2认同)
  • 请参阅我对@Tanveer 的回答的评论。您无法估算 GC 的成本。 (2认同)

小智 22

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

  • 如果地图中的键和值未在其他任何地方引用,则仅提供大O估计值.如果在应用程序的其他位置引用了任何键和值,那么它们将不会被垃圾回收.也许我错了,如果通过"清理"你的意思是垃圾收集器必须检查对象,看它是否需要垃圾收集.这里有另一点......垃圾收集器可能_never_清理对象,即使没有对它们的引用:http://stackoverflow.com/a/2506525/361855.我的观点是,在更改地图参考时,您无法估算GC的成本. (2认同)

小智 9

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


Sur*_*ran 5

使用clear()方法的想法是从地图中删除对其他对象的引用,这样如果"地图被引用到其他地方",则键/值不会受到限制.

但是,如果您的地图是仅由您的特定代码使用的本地地图(即"地图"未在其他地方引用"),那么继续使用新地图,但设置1000引用为null将不会是一个重大的性能打击无论如何.