我的地图语法为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将被收集垃圾。
但我不确定这会是一个好方法。我正在研究移动应用程序。
你能指导我吗?
答案 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)总数,但如果它们首先没有发生,你仍然会更好)
清除地图不会发生这种情况,因为容量不会改变