well i hope you understand why we define an arraylist like this
List<E> l = new Arraylist<E>();<--< this means the array list is referred from List Reference variable.We can use the superclass type to declare a reference variable.
Now from the Arrays.aslist(), we get a List<E> return type. So it should be stored in a reference type which is of the type List<E> means a reference bitpattern of the type List is returned and not the entire object so we take that bitpattern and store it in the List type only. But internally how the array is converted to list and what list type is used is encapsulated and i guess you don't need to worry about that.
About comparable, the sort method that is used for collections is used to compare the objects of the list i.e this object with the list passed as an argument.
String and Wrapper classes have implemented the comparable interface so we don't need to implement it again. But if we use our own class (<classname>), what is that should be compared and how? that thing is specified by using a comparable and that should be done for the mutually comparable class.
Comparator is a specific role that you specify for that collection. Take ordering and sorting. Order can be any thing but when sorting is done its done with a specific rule. Using Comparator, we can specify how the objects should be compared and on what basis.