Нет, toString в конце создает новую строку (проверьте код, если хотите, все источники Java-библиотеки доступны).
Поскольку строки неизменяемы, на самом деле нет способа избежать выделения, потому чтовы возвращаете строку.
Если вы вернете компоновщик строк, который вы использовали для создания своего номера, и повторно использовали его при следующем вызове, и НИКОГДА не конвертируете его в строку, все будет в порядке, но в следующий раз вы преобразуете его в строку(независимо от того, как вы это сделали) вы выделяете память.
Чтобы сделать это, ваш метод должен либо принять переданный изменяемый объект (StringBuilder или char массив), либо ему придется повторно использовать статический объект.(делая его однопоточным)
Я пробовал это один раз, и в какой-то момент это всегда сводится к тому, чтобы преобразовать его в строку, отменив всю вашу работу и сделав ее еще медленнее, чем если бы вы просто использовалиочевидный путь.
Также помните, что в Java кратковременное выделение памяти не так плохо, как вы думаете, - это больше похоже на распределение стека в C с точки зрения производительности.
Исследования и тесты, которые я провел, показали, что единственное, что вы можете сделать, - это избегать объединения строк в цикле - всего остального (включая одноразовую строку conc.Любой простой код будет таким же быстрым или быстрым, как и все, что вы можете придумать.