You said it yourself - "1>Is it because instead of returning a map object does the getter returns only object reference?" .
Yes,in Java everything is manipulated using references to objects
. You are getting the reference of the map, changing it.. Even though you have declared it as "final", final and immutability are 2 different things.. final means , "you can't change the reference", immutability means - "you can't change the value of the object". By declaring a non-primitive variable as final, you are saying - "I will not make this reference point to anything else. But I can change the properties of the object to which my reference points." . for primitives, you cant change the value of a final variable. Immutability is not a built in feature in Java. Immutability can be achieved by providing only "public getters", not setters. Immutablity prevents changing of value of an object. final prevents changing of reference. Remember- - "In Java references are passed by value".
In case you want unmodifiable/immutable list, you can use
Collections.unmodifiableList
check out - Java Immutable Collections