Con la riga:

char[] vch = str.toCharArray ();

ottengo chiaramente un array di char con i caratteri della stringa, fin qui è semplice.

Con la riga:

vch[j++] = vch[i];

faccio un'altra cosa: in pratica riscrivo sull'array saltando i caratteri da rifiutare. Ci sono 2 indici: 'i' e 'j'. Il primo va sempre avanti in modo lineare (c'è il i++ nel for, quindi ad ogni ciclo si incrementa). il secondo si incrementa solamente man mano che riscrivo caratteri "buoni" nell'array. Il risultato finale è che i caratteri "buoni" vengono "compattati" all'inizio dell'array.

Se non ti piace, usa uno StringBuffer/StringBuilder in cui aggiungi al fondo i caratteri validi.