Ответ прост:
token = token.replace("&", "&");
Несмотря на название, по сравнению с replaceAll, заменить это сделать replaceAll, он просто не использует регулярное выражение, которое, кажется, в порядке здесь (оба производительность и перспектива хорошей практики - не используйте регулярные выражения случайно, поскольку они имеют особые требования к персонажам, на которые вы не будете обращать внимания).
Ответ Шона Брайта, вероятно, так же хорош, как стоит подумать с точки зрения производительности, если у вас нет какого-либо дополнительного целевого требования при тестировании производительности и производительности, если вы уже знаете, что этот код является горячей точкой для производительности, если это ваш вопрос исходит из. Это, конечно, не заслуживает нисходящих спусков. Просто используйте StringBuilder вместо StringBuffer, если вам не нужна синхронизация.
Это, как говорится, есть несколько более глубокая потенциальная проблема. Экранирование символов - известная проблема, которую адресуют множество библиотек. Возможно, вы захотите рассмотреть вопрос об упаковке данных в разделе CDATA в XML, или вы можете предпочесть использовать библиотеку XML (включая ту, которая поставляется вместе с JDK), чтобы фактически генерировать XML правильно (чтобы он обрабатывал кодировку).
Apache также имеет escaping library как часть Commons Lang.
Будьте осторожны с replaceAll , потому что он использует свой первый аргумент как регулярное выражение. То есть «h.e.l.l.o» .replaceAll («.», «,») даст вам «,,,,,,,,,»! В Java 1.5 существует новый метод String.replace (CharSequence, CharSequence), который делает что-то подобное, но не интерпретирует первый аргумент как регулярное выражение. –