В Java, как и во всех других языках ООП, одним из основных преимуществ проектирования является Полиморфизм. Полиморфизм просто не включает методы, но распространяется и на классы и принимает имена, такие как подтип, политипизм и т. Д.
В вашем первом примере кода:
List<String> a = new LinkedList<String>();
Заставляет тип ссылочной переменной 'a' принимать любые конкретные расширения типа 'List'.
Где, как в следующем примере кода:
LinkedList<String> a = new LinkedList<String>();
Ссылочная переменная 'a' может принимать любые расширения типа 'LinkedList'.
Чтобы понять силу этого, мы должны проверить иерархию типов LinkedList:
http://docs.oracle.com/javase/7/docs/api/java/util/LinkedList.html
Таким образом, в вашем первом примере вы увеличиваете область ссылки «a» на любой конкретный тип «List», который также включает LinkedList, где, как и во втором примере, вы уменьшаете свою область действия до типа «LikedList» и его подтипов. .
Один не лучше другого, но многое зависит от вашего дизайна кода и приложения в отношении того, какой подход лучше всего подходит для вашего варианта использования.
Некоторые хорошие чтения:
Полиморфизм подтипов: http://en.wikipedia.org/wiki/Polymorphism_(computer_science)#Subtyping