0
votes

e.g. I have a need where my ArrayList should contain hashmap at each index, e.g.

Public class Testing {
  private ArrayList &lt &lt HashMap&lt String, String>> myData ;
  public static void main(String[] args) {
    myData = new ArrayList &lt HashMap &lt String, String>>();
    initialize();
    //After initialize myData should contain different Hashmaps.
  }
  public static void initialize() {     
    for (int i= 0; i &lt 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);
    } 

  }
}

Above code will create hash map objects every time in the loop, what is the better way to do it, so that I can avoid creation of objects every time ? I am using this code in Android , but I think this is more general and related to Java more.

3
Why do you want to avoid it? Modern JVMs are very good at this. Do you have evidence that it's a problem for your application? - skaffman
Ok , I am using this code in android , mobile operating system , here Garbage collector kicks in every now and then , so have to avoid creation of objects for performance and optimal usage of memory. - sat
I don't believe the GC will kick in as a result of this code (assuming it compiled) even on a phone. - Peter Lawrey
ok , considering that many experienced programmers are indicating that , this is not a bad way. I will not do any changes for my requirement Thanks everyone. - sat
@sat if you use android, you should tag the question that way - Sean Patrick Floyd

3 Answers

5
votes

If you need a List of Maps, then that is what you will have to do, there is no way around that. (Actually there is, you could write a helper method that initializes the maps when first accessed and only access the map through that helper method, but I wouldn't really recommend that).

But you could rethink your design and use a different data structure, perhaps turn the Map / List relation around and use a Guava Multimap. That will only initialize the collections when they are needed, and you can save your initialization routine.

Also, a List of Maps can often be replaced by a List of custom objects. Depending on whether the keys are dynamic or not, a custom object may make more sense.

1
votes

Usually clarity is more important than performance. In this example, having it compile would be an improvement. ;)

You are not creating enough objects to really matter, but one way to reduce its consumption is to use a POJO instead of a HashMap.

0
votes

I don't think it's bad.

Since you want an ArrayList<<HashMap<String, String>>, there's nothing wrong. Even no bad smell:)