Pass an object as a parameter and modify it within the method
java, memory, optimization
Solution
The best way is `methodThatRemoves` because:
- In terms of memory consumption: it doesn't create a new map so doesn't add memory overhead.
- In terms of CPU use: iterator has O(1) complexity for calling next or removing the current element.
Problem
Let's say I got a `Map<String, String>` and I wanna remove all the entries that value contains `foo`. What is the best way to do it, in terms of optimization/memory/etc.? The four `syso` below are printing the same result, that is to say `{n2=bar}`. ``` public static void main(String[] args) { Map<String, String> in = new HashMap<String, String>(); in.put("n1", "foo"); in.put("n2", "bar"); in.put("n3", "foobar"); // 1- create a new object with the returned Map Map<String, String> in1 = new HashMap<String, String>(in); Map<String, String> out1 = methodThatReturns(in1); System.out.println(out1); // 2- overwrite the initial Map with the returned one Map<String, String> in2 = new HashMap<String, String>(in); in2 = methodThatReturns(in2); System.out.println(in2); // 3- use the clear/putAll methods Map<String, String> in3 = new HashMap<String, String>(in); methodThatClearsAndReadds(in3); System.out.println(in3); // 4- use an iterator to remove elements Map<String, String> in4 = new HashMap<String, String>(in); methodThatRemoves(in4); System.out.println(in4); } public static Map<String, String> methodThatReturns(Map<String, String> in) { Map<String, String> out = new HashMap<String, String>(); for(Entry<String, String> entry : in.entrySet()) { if(!entry.getValue().contains("foo")) { out.put(entry.getKey(), entry.getValue()); } } return out; } public static void methodThatClearsAndReadds(Map<String, String> in) { Map<String, String> out = new HashMap<String, String>(); for(Entry<String, String> entry : in.entrySet()) { if(!entry.getValue().contains("foo")) { out.put(entry.getKey(), entry.getValue()); } } in.clear(); in.putAll(out); } public static void methodThatRemoves(Map<String, String> in) { for(Iterator<Entry<String, String>> it = in.entrySet().iterator(); it.hasNext();) { if(it.next().getValue().contains("foo")) { it.remove(); } } } ```