No seu caso, use um Set<String> estados = new LinkedHashSet <String>() ou um SortedSet<String> estados = new TreeSet<String>(). Eles têm a interessante propriedade de não aceitarem valores repetidos automaticamente.
No primeiro caso (LinkedHashSet) ele preserva a ordem de inserção, ou seja, se você puser primeiro “SP”, “RJ” e depois os outros estados, permanece nessa ordem. No segundo caso (TreeSet) ele deixa sempre ordenado, ou seja, fica “AC”, “AL”, “AM”, “AP” etc. Não é preciso verificar se o elemento já existe no conjunto.
List tem o método contains (que procura na lista), e Set tem o método contains (que procura no Set) também.
No seu caso o conjunto de estados é minúsculo e é em resposta a uma ação do usuário, então a diferença de desempenho entre um List e um Set é desprezível.