Ответ 1
s += "n";
Это работает на строке на месте. Существует вероятность того, что перераспределение памяти не потребуется. Но строковые литералы представляют собой последовательности символов с нулевым символом, поэтому код должен найти значение 0 в памяти после "n".
s += 'n';
Это похоже на первое, но вместо строкового литерала используется символьный литерал. Нет необходимости искать 0, поэтому он может быть быстрее.
s = s + "n";
Найти 0 есть, но более того - гораздо больше - нужно создать новый временный строковый объект, и, скорее всего, это означает распределение памяти, которое на порядок или более дорого.
s = s + 'n';
Может быть быстрее предыдущего, но разница, вызванная поиском 0, скорее всего, незначительна по сравнению с временным созданием и распределением объектов в куче.
Обратите внимание на все "возможно" и "может быть". То, что я описал, может случиться в популярных компиляторах, но различные оптимизации могут полностью изменить изображение.