Arrays.asList returned List - Its modifying/write-through semantics

Jaikiran Pai jai.forums2013 at gmail.com
Wed Aug 15 05:58:54 UTC 2018


Consider the following code:

import java.util.Arrays;
import java.util.List;

public class ArraysAsListTest {

    public static void main(final String[] args) throws Exception {
        final List<String> someList = Arrays.asList(new String[] {"a"});
        System.out.println("Removed? " + someList.remove("a"));
    }
}

It uses Arrays.asList to create a java.util.List and then calls a
list.remove(...) on it. This currently runs intothe following exception:

Exception in thread "main" java.lang.UnsupportedOperationException: remove
    at java.base/java.util.Iterator.remove(Iterator.java:102)
    at
java.base/java.util.AbstractCollection.remove(AbstractCollection.java:299)
    at ArraysAsListTest.main(ArraysAsListTest.java:8)

The javadoc of Arrays.asList[1] states the following:

"Returns a fixed-size list backed by the specified array. (Changes to
the returned list "write through" to the array.)..."

and has no other mention of how it's supposed to behave with "write"
operations. Given that the javadoc states that the returned list is
"write through", would that mean a "add/removal" is allowed? Probably
not, because it does say it's a fixed size list.So the size altering,
write operations (like add(), remove()) aren't allowed, but that isn't
clear from the javadoc. So should the javadoc be updated to clarify the
semantics of what changes are "write through" and what changes are not
supported?

Furthermore, the UnsupportedOperationException isn't always thrown from
such a returned list. Consider this minor modification to the above code:

        final List<String> someList = Arrays.asList(new String[] {"a"});
        System.out.println("Removed? " + someList.remove("b"));

I add "a" and remove "b". This now runs fine without exceptions and
prints "Removed? false". Should the implementation just throw the
UnsupportedOperationException irrespective of whether or not the element
is contained insuch a returned list? If not, should that be made clear
in the javadoc (maybe same for addoperations)?

[1]
https://docs.oracle.com/javase/10/docs/api/java/util/Arrays.html#asList(T...)

-Jaikiran




More information about the core-libs-dev mailing list