Ответ 1
Нет никакой разницы между реализациями списков в обоих ваших примерах. Однако существует разница в том, как вы можете использовать переменную myList в своем коде.
Когда вы определяете свой список как:
List myList = new ArrayList();
вы можете вызывать только методы и ссылочные элементы, которые определены в интерфейсе List. Если вы определяете его как:
ArrayList myList = new ArrayList();
вы сможете вызвать методы, специфичные для ArrayList, и использовать элементы, зависящие от ArrayList, в дополнение к тем, чьи определения наследуются от List.
Тем не менее, когда вы вызываете метод интерфейса List в первом примере, который был реализован в ArrayList, будет вызван метод из ArrayList (поскольку интерфейс List не реализует никаких методов).
Это называется полиморфизмом. Вы можете прочитать об этом.