如何避免在java中循环中频繁创建对象?

Posted

技术标签:

【中文标题】如何避免在java中循环中频繁创建对象?【英文标题】:How to avoid frequent creation of objects in a loop in java? 【发布时间】:2011-06-28 04:57:27 【问题描述】:

例如 我需要我的 ArrayList 应该在每个索引处包含哈希图,例如

公共类测试 私有 ArrayList &lt &lt HashMap&lt String, String>> myData ; 公共静态无效主要(字符串[]参数) myData = new ArrayList &lt HashMap &lt String, String>>(); 初始化(); //初始化后myData应该包含不同的Hashmap。 公共静态无效初始化() 对于 (int i= 0; i

上面的代码会在每次循环中创建哈希映射对象, 有什么更好的方法可以避免每次都创建对象? 我在 android 中使用此代码,但我认为这更通用,并且与 Java 更相关。

【问题讨论】:

为什么要避免它?现代 JVM 在这方面非常很擅长。您是否有证据表明您的应用程序存在问题? 好的,我在安卓移动操作系统中使用这个代码,这里垃圾收集器时不时地启动,所以必须避免创建对象以提高性能和优化内存使用。 我不相信 GC 会因为这段代码(假设它已编译)而启动,即使在手机上也是如此。 ok ,考虑到许多有经验的程序员都表示,这不是一个坏方法。我不会为我的要求做任何更改谢谢大家。 @sat 如果你使用android,你应该这样标记问题 【参考方案1】:

我不认为这很糟糕。

既然你想要ArrayList<<HashMap<String, String>>,那就没有错。甚至没有难闻的气味:)

【讨论】:

【参考方案2】:

通常清晰度比性能更重要。在这个例子中,让它编译将是一个改进。 ;)

您没有创建足够多的真正重要的对象,但减少其消耗的一种方法是使用 POJO 而不是 HashMap。

【讨论】:

当我从最近(和创伤性的)Android 编程尝试中学习时,清晰度通常不得不让位于性能。这让小耶稣哭了。 同意。但是,Android 上的 GC 很糟糕。这就像回到 90 年代后期。 对我来说不需要编译上面的代码,因为它只是我原始代码中的一个sn-p代码。再次感谢,会寻找其他方法优化:)【参考方案3】:

如果您需要地图列表,那么这就是您必须做的事情,没有办法解决。 (实际上,您可以编写一个辅助方法,在第一次访问时初始化地图,并仅通过该辅助方法访问地图,但我不建议这样做)。

但是您可以重新考虑您的设计并使用不同的数据结构,或者将 Map / List 关系转过来并使用Guava Multimap。这只会在需要时初始化集合,您可以保存初始化例程。

此外,地图列表通常可以替换为自定义对象列表。根据键是否是动态的,自定义对象可能更有意义。

【讨论】:

以上是关于如何避免在java中循环中频繁创建对象?的主要内容,如果未能解决你的问题,请参考以下文章

《Effective Java 中文版 第2版》学习笔记 第5条:避免创建不必要的对象

如何避免频繁创建临时对象

避免创建不必要的对象

Android App解决卡顿慢之内存抖动及内存泄漏(发现和定位)

如何避免内存溢出和频繁的垃圾回收

如何避免内存溢出和频繁的垃圾回收