Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Java Collections with Mutable Objects

How does a TreeSet, HashSet or LinkedHashSet behave when the objects are mutable? I cannot imagine that they would work in any sense?

If I modify an object after I have added it; what is the behaviour of the list?

Is there a better option for dealing with a collection of mutable objects (which I need to sort/index/etc) other than a linked list or an array and simply iterating through them each time?

like image 397
laurencer Avatar asked Aug 29 '10 06:08

laurencer


People also ask

Is HashSet mutable in Java?

HashSet Using Java 9 Set Interface Since Java 9, the Set interface supports various useful method. For this example we will look at the of method for creating HashSets. However, the Set you create out of this is Immutable. Hence you cannot change or add any elements to it.

What are the mutable objects in Java?

What are Mutable Objects. The mutable objects are objects whose value can be changed after initialization. We can change the object's values, such as field and states, after the object is created. For example, Java.

Is set collection mutable?

Set is agnostic about whether the object that you are inserting into it is mutable or immutable. It's just like a collection which hold values. Edit: As per the code, checks in set would be done when you insert the element to the Set and then if it changes, it wont care about it.

Which objects are mutable that is modifiable in Java?

The objects in which you can change the fields and states after the object is created are known as Mutable objects. Example: java. util. Date, StringBuilder, and etc.


2 Answers

The Set interface addresses this issue directly: "Note: Great care must be exercised if mutable objects are used as set elements. The behavior of a set is not specified if the value of an object is changed in a manner that affects equals comparisons while the object is an element in the set. A special case of this prohibition is that it is not permissible for a set to contain itself as an element."

Addendum:

Is there a better option for dealing with a collection of mutable objects?

When trying to decide which collection implementation is most suitable, it may be worth looking over the core collection interfaces. For Set implementations in particular, as long as equals() and hashCode() are implemented correctly, any unrelated attributes may be mutable. By analogy with a database relation, any attribute may change, but the primary key must be inviolate.

like image 101
trashgod Avatar answered Sep 22 '22 22:09

trashgod


Being mutable is only a problem for the collection if the objects' hashCode and behaviour of compare methods change after it is inserted.

The way you could handle this is to remove the objects from the collection and re-adding them after such a change so that the object.

In essence this results in a inmutable object from the collections' point of view.

Another less performant way could be to keep a set containing all objects and creating a TreeSet/HashSet when you need the set to be sorted or indexed. This is no real solution for a situation where the objects change constantly and you need map access at the same time.

like image 32
rsp Avatar answered Sep 20 '22 22:09

rsp