Функционально строка представляет собой список или последовательность символов. Строки часто хранятся прозрачно как символьные массивы (например, в C), поэтому мы часто ссылаемся на них таким образом. Массивы обеспечивают удобный произвольный доступ к символам, что важно для некоторых алгоритмов.
Однако для других целей хранение строк Unicode в формате UTF-8 может быть наиболее подходящей формой. Обратите внимание, что, хотя он хранится в байтовом массиве, больше нет однозначного соответствия между байтами и символами: вашим строковым алгоритмам обычно требуется последовательно обращаться к символам с самого начала - в виде списка.
Мораль этой истории такова: ваш строковый код должен требовать произвольного доступа, только если он действительно нужен. Вы можете быть удивлены, как редко вам действительно нужен массив символов.