La conception Java de la "boucle for améliorée" était de ne pas exposer l'itérateur au code, mais la seule façon de supprimer un élément en toute sécurité est d'accéder à l'itérateur. Donc, dans ce cas, vous devez le faire à l'ancienne :
for(Iterator<String> i = names.iterator(); i.hasNext();) {
String name = i.next();
//Do Something
i.remove();
}
Si, dans le code réel, la boucle for améliorée en vaut vraiment la peine, vous pourriez ajouter les éléments à une collection temporaire et appeler removeAll sur la liste après la boucle.
EDIT (re addendum) : Non, modifier la liste de quelque manière que ce soit en dehors de la méthode iterator.remove() pendant l'itération posera des problèmes. La seule façon de contourner ce problème est d'utiliser une CopyOnWriteArrayList, mais cela est vraiment destiné aux problèmes de concurrence.
La méthode la plus économique (en termes de lignes de code) pour supprimer les doublons consiste à vider la liste dans un LinkedHashSet (puis à la retransformer en liste si nécessaire). Cela préserve l'ordre d'insertion tout en supprimant les doublons.