0

I have a Class1 with private attribute TreeMap<Long, List<Class2>> tree; and others, I want to write a constructor Class1(Class1 copyOfClass1). Should I create the List values of the TreeMap explicitly (e.g., in a loop), or using this.tree=new TreeMap(copyOfClass1.tree) does that?

aLogic
  • 125
  • 1
  • 8

1 Answers1

1

If you use this.tree=new TreeMap(copyOfClass1.tree) it will be equivalent as

this.tree=new TreeMap();
this.tree.putAll(copyOfClass1.tree)

However, it will not make a copy of the list that are stored in the map. The keys will be pointing to the same lists.

If you dont want this behavior I would suggest to iterate over the entries and to make a copy of the lists.

    this.tree = new TreeMap<Long, List<Class2>>();
    for (Entry<Long, List<Class2>> entry : copyOfClass1.tree.entrySet()) {
        this.tree.put(entry.getKey(), new ArrayList<Class2>(entry.getValue()));
    }
Xavier Delamotte
  • 3,519
  • 19
  • 30
  • And if instead of List I am using another class that I have created, do I need to do the same? I mean, only primitive types are copied by value? – aLogic Apr 17 '13 at 15:45
  • Yes you need to do the same. About the "copy by value": "Java is always pass-by-value. The difficult thing can be to understand that Java passes objects as references passed by value." http://stackoverflow.com/questions/40480/is-java-pass-by-reference – Xavier Delamotte Apr 17 '13 at 15:55