in your example "List<String>" is the interface and "ArrayList<String>" is a concrete implementation of this interface.
This means that you can call only the methods of the interface on the variable "myList" because List is its declaration type. On the one hand this may seem like a restriction. But on the other hand this approach has the big advantage that your code is not coupled to a specific List implementation but only to the List interface. And this in turn means that you can later substitute the ArrayList with another concrete List implementation like LinkedList for example. This would not be possible if you would not code to the interface and call special ArrayList methods on variable myList!