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

如何避免在java中频繁创建循环中的对象?,java,android,performance,memory-management,Java,Android,Performance,Memory Management,e、 g。 我的ArrayList需要在每个索引处包含hashmap,例如 Public class Testing { private ArrayList < < HashMap< String, String>> myData ; public static void main(String[] args) { myData = new ArrayList < HashMap < String, String>>(); initialize();

e、 g。 我的ArrayList需要在每个索引处包含hashmap,例如

Public class Testing { private ArrayList < < HashMap< String, String>> myData ; public static void main(String[] args) { myData = new ArrayList < HashMap < String, String>>(); initialize(); //After initialize myData should contain different Hashmaps. } public static void initialize() { for (int i= 0; i < 10 ;i++) { myMap = new HashMap(); //Bad because,creating Objects inside the loop. myMap.put("title", "abc"+i); //Adding i, just to show that new values are stored everytime myMap.put("name", "xyz"+i); myData.add(myMap); } } } 公共类测试{ 私有ArrayList<< HashMap< String,String>>myData; 公共静态void main(字符串[]args){ myData=newarraylist< HashMap< String,String>>(); 初始化(); //初始化后,myData应包含不同的Hashmaps。 } 公共静态void initialize(){ 对于(int i=0;i< 10;i++){ myMap=new HashMap();//错误,因为在循环中创建对象。 myMap.put(“title”,“abc”+i);//添加i,只是为了显示每次都存储新值 myMap.put(“名称”、“xyz”+i); myData.add(myMap); } } } 上述代码将在循环中每次创建哈希映射对象, 有什么更好的方法可以避免每次创建对象?
我在Android中使用这段代码,但我认为这更一般,与Java更相关。

如果你需要地图列表,那么这就是你必须要做的,没有办法。(实际上,您可以编写一个helper方法,在第一次访问映射时初始化映射,并且只通过该helper方法访问映射,但我并不推荐这样做)

但是,您可以重新考虑您的设计并使用不同的数据结构,也许可以改变地图/列表的关系并使用一个新的数据结构。这将仅在需要时初始化集合,您可以保存初始化例程


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

如果您需要地图列表,那么这就是您必须要做的,没有办法。(实际上,您可以编写一个helper方法,在第一次访问映射时初始化映射,并且只通过该helper方法访问映射,但我并不推荐这样做)

但是,您可以重新考虑您的设计并使用不同的数据结构,也许可以改变地图/列表的关系并使用一个新的数据结构。这将仅在需要时初始化集合,您可以保存初始化例程


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

通常清晰度比性能更重要。在本例中,将其编译将是一种改进。;)


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

通常清晰度比性能更重要。在本例中,将其编译将是一种改进。;)


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

我认为这并不坏


既然你想要一个
ArrayList,我认为这并不坏


既然您想要
ArrayList,为什么要避免它?现代JVM非常擅长这一点。你有证据表明这是你的应用程序的一个问题吗?好的,我在android移动操作系统中使用这段代码,垃圾收集器时不时会出现,因此必须避免创建对象以提高性能和优化内存使用。我不相信GC会因为这段代码而出现(假设它已编译)即使是在电话上。好吧,考虑到许多有经验的程序员都表示,这不是一个坏方法。我不会对我的要求做任何更改,谢谢大家。@sat如果你使用android,你应该这样标记问题为什么要避免它?现代JVM非常擅长这一点。你有证据表明这是你的应用程序的一个问题吗?好的,我在android移动操作系统中使用这段代码,垃圾收集器时不时会出现,因此必须避免创建对象以提高性能和优化内存使用。我不相信GC会因为这段代码而出现(假设它已编译)即使是在电话上。好吧,考虑到许多有经验的程序员都表示,这不是一个坏方法。谢谢大家,我不会对我的要求做任何更改。@sat如果你使用android,你应该这样标记问题。我从最近(也是痛苦的)对android编程的尝试中学到了这一点,clarity通常不得不退居性能之后。它让婴儿耶稣哭了。同意。然而,Android上的GC非常糟糕。这就像回到了90年代后期。编译上述代码对我来说不是必要的,因为它只是我原始代码中的一段代码。再次感谢,威尔将用其他方法搜索优化:)我从最近(也是痛苦的)对Android编程的尝试中学到,clarity通常不得不退居性能之后。它让婴儿耶稣哭了。同意。然而,Android上的GC非常糟糕。这就像回到了90年代后期。编译上述代码对我来说不是必要的,因为它只是我原始代码中的一段代码。再次感谢,我们将用其他方法搜索优化:)