Если немного поискать в Интернете, кажется, что смысл символов (литералов символов) в Scala (подобный языку) по сравнению со строками - это вопрос семантики, и, возможно, даже понимания компилятором.
'String' - это тип данных, состоящий из последовательности символов. Вы можете оперировать строками и манипулировать ими. Семантически могут быть любые текстовые данные, от имени файла до сообщения, которое будет напечатано на экране, строки в CSV-файле и т. Д.
Для компилятора, и, следовательно, строки IDE являются значениями типа данных String, например, числа (последовательности цифр) являются значениями типа данных, скажем: Integer.
На уровне программы нет никакой разницы между "foo" и "bar".
OTOH Символы - это идентификаторы, то есть семантически идентифицирующие элемент в программе.
В этом вопросе они похожи на имена классов, имена методов или имена атрибутов.
Но в то время как имя класса идентифицирует класс -i.e. набор свойств, объявляющих структуру и поведение класса, и имя метода идентифицирует метод -i.e. параметры и операторы-, имя символа идентифицирует символ -i.e. себя, не более -
Таким образом, компилятор может явно различать символы 'foo и' bar, как он различает классы Foo и Bar. Как часть таблицы символов компилятора, вы можете применять те же механизмы в IDE, например, искать использование 'foo (т.е. ссылки на этот символ) так же, как вы ищете использование класса Foo.
Для сравнения, поиск строки "foo" потребовал бы других подходов, таких как полнотекстовое сканирование. Он следует той же семантике, что и поиск всех вхождений 4711 в программном коде.
Вот как я понимаю, кто-то может поправить меня, если я ошибаюсь.