地图清除与空

2022-09-04 22:07:57

我有一个地图,我用它来存储动态数据,这些数据在创建后立即被丢弃(即使用;它们很快就会被消耗)。它响应用户交互,因为当用户单击按钮时,将填充映射,然后使用数据执行一些工作,然后不再需要该映射。

所以我的问题是,清空地图的更好方法是什么?我应该每次都将其设置为 null 还是应该调用 ?我知道清晰在时间上是线性的。但我不知道如何将这个成本与每次创建地图的成本进行比较。地图的大小不是恒定的,认为它可能在创作之间从n到3n个元素运行。clear()


答案 1

如果一个映射不是从其他对象引用的,而这些对象可能很难设置一个新映射,那么简单地 - 出一个旧映射并从头开始可能比调用一个更轻量级,因为不需要进行线性时间清理。由于现代系统上的垃圾回收成本很小,因此您很有可能以这种方式节省一些CPU周期。通过指定初始容量,可以避免多次调整映射大小。nullclear()

首选的一种情况是,在系统中的多个对象之间共享映射对象。例如,如果创建一个映射,将其提供给多个对象,然后在其中保留一些共享信息,则在所有这些对象中将映射设置为新映射可能需要保留对具有映射的对象的引用。在这种情况下,继续调用相同的共享地图对象会更容易。clear()clear()


答案 2

好吧,这取决于您可以向它投入多少内存。如果你有很多,那就没关系了。但是,将映射本身设置为 null 意味着您已经释放了垃圾回收器 - 如果只有映射具有对其中实例的引用,则垃圾回收器不仅可以收集映射,还可以收集其中的任何实例。Clear会清空映射,但它必须迭代映射中的所有内容才能将每个引用设置为 null,这发生在您可以控制的执行期间 - 垃圾回收器基本上必须完成这项工作,所以让它做它的事情。请注意,将其设置为 null 并不允许您重用它。重用映射变量的典型模式可能是:

Map<String, String> whatever = new HashMap<String, String();
// .. do something with map
whatever = new HashMap<String, String>();

这允许您重用变量,而无需将其设置为 null,您可以静默地放弃对旧映射的引用。这在非内存托管应用程序中是残酷的做法,因为它们必须引用旧指针才能清除它(这是其他语言中的悬空指针),但在Java中,由于没有引用它,GC将其标记为符合收集条件。