Простой ответ:
token = token.replace("&", "&");
Несмотря на имя по сравнению с replaceAll, replace делает replaceAll, он просто не использует регулярное выражение, которое здесь выглядит правильно (как с точки зрения производительности, так и с точки зрения хорошей практики - не используйте регулярные выражения). выражения случайно, поскольку в них есть особые требования к символам, на которые вы не будете обращать внимания).
Ответ Шона Брайта, вероятно, так же хорош, как о нем стоит подумать с точки зрения производительности, если отсутствуют какие-либо дополнительные целевые требования к тестированию производительности и производительности, если вы уже знаете, что этот код является горячей точкой для повышения производительности, если именно здесь ваш вопрос приходящий из. Это, конечно, не заслуживает отрицательных голосов. Просто используйте StringBuilder вместо StringBuffer, если вам не нужна синхронизация.
При этом, здесь есть несколько более глубокая потенциальная проблема. Экранирование символов - известная проблема, которую решают многие библиотеки. Возможно, вы захотите обернуть данные в раздел CDATA в XML, или вы можете использовать библиотеку XML (в том числе ту, которая входит в комплект JDK), чтобы на самом деле правильно генерировать XML (чтобы он обрабатывал кодировку). ).
Apache также имеет экранирующую библиотеку в составе Commons Lang.