Второй даже не скомпилируется. Часто люди спрашивают, в чем разница между этими :
HashSet<Integer> intset = new Hashset<Integer>();
Set<Integer> intset = new HashSet<Integer>();
и, возможно, это то, что вы хотели спросить. Разница здесь в том, что код, написанный с использованием первого определения, зависит от конкретного выбора реализации Set (HashSet против TreeSet или чего-то еще), тогда как второе объявление позволит вам тривиально перейти на другую реализацию без изменения какого-либо другого кода. В целом, это хорошая практика - она сохраняет гибкость.