As you would expect in a vaguely modern language, Java's "List" interface is typically backed by a growable array as the type ArrayList. Only people who have no idea about caches would think List should necessarily be some sort of Linked List type.
You would use Collections.unmodifiableList to make it unmodifiable.
Collections.unmodifiableList doesn’t prevent anyone who has a reference to the original List (or the array behind it) from modifying the List. Calling that in the constructor would not help.
As I explained, List is an interface. You can't instantiate it, values are instances of types not interfaces.
All that return type is telling you is, surprise, asList promises what you're getting implements the List interface. See if you can guess how you can implement the List interface using an Array. Still struggling, here's the one line of a typical implementation:
Lots of common ways to instantiate arrays (i.e. Arrays.asList) generate immutable lists