By looking at the code of Collections
class, i got to know that when we are using the method unmodifiableList(List list)
or unmodifiableCollection(Collection c)
it is not creating a new object but it is returning the reference of the same object and overriding the methods which can modify the List
[ add
, addall
, remove
, retainAll
... ]
So i ran this test:
List modifiableList = new ArrayList();
modifiableList.add ( 1 );
List unmodifiableList = Collections.unmodifiableList( modifiableList );
// unmodifiableList.add(3); // it will throw the exception
modifiableList.add ( 2 );
System.out.println( unmodifiableList );
result is [ 1,2 ]
.
Now the point is why it is referring to the same object? Why it don't create a new object?
(answer of the queston at the bottom)
When you create an unmodifiable list, the purpose is that it should not be modified by people other than you - i.e. clients of an API.
the method unmodifiableList(..)
creates a new object of type UnmodifiableList
(but this is not a public class), which gets the original list, and delegates all methods to it except the methods which would modify it.
The point is, as stated in the documentation:
Returns an unmodifiable view of the specified list. This method allows modules to provide users with "read-only" access to internal lists.
So, an example: You have a List
of devices that your API has detected and can operate, and you want to give them a client of your API. But he is not supposed to change them. So you have two options:
List
, so that even if he modifies it, this does not change your listAnd now here comes the answer to the title of your question - the unmodifiable list is a view of the original collection. So if you need to add a new item to it - say, you have discovered a new device that was just plugged-in, the clients will be able to see it in their unmodifiable view.