What is the benefit of doing this? Why is java.util.ArrayList not referred instead?
One reason is that the actual implementation class is not a public API detail. Doing this means that they can change the implementation class it in the future ... without any risk of breaking customer code.
Another reason for doing this is that this private class implements some operations differently to ArrayList. In particular operations that would involve changing the size of the list need to be implemented to throw an exception ... in order to conform to the behavior specified in the javadocs for the Arrays.asList(...) method.
In reality, the list returned by Arrays.asList(...) is a wrapper for the original array, and not a full-function, free-standing list. This is has advantages and disadvantages:
On the down-side, certain operations don't work; e.g. adding and removing elements.
On the up-side, creating a wrapper is a lot cheaper than creating a first-class list out of an array. (The latter entails copying the array contents into the list ... and that will be expensive for a large array.)
Also, there is the issue that changes to the original array are visible via the wrapper (and vice versa) ... which can be useful if that is what you need.
You asked this in a comment:
a) Why return non resizable list?
Because returning a regular resizable list entails copying the array contents at some point... which is expensive. (And if the implementation deferred the copying until a size-changing operation was performed, the relationship between the original array and the list would be really difficult to understand. Think about it ...)
b) Why not use Collections.unmodifiableList and pass the java.util.ArrayList object?
That doesn't achieve anything. You still have to copy the array contents to the ArrayList. The whole point of this "strange" behavioral spec is to avoid the need to copy.