Строковый литерал Java автоматически интерпретируется как объект String, но как? - PullRequest
8 голосов
/ 24 марта 2011

Какова механика Java, автоматически интерпретирующая строковые литералы как объекты String, поскольку нет перегруженных операторов и отсутствует поддержка по умолчанию низкоуровневых строковых буферов (не включая высокоуровневый StringBuffer)?Это язык или контекст виртуальной машины?

Ответы [ 3 ]

6 голосов
/ 24 марта 2011

Это немного того и другого.

В JVM есть байтовые коды для загрузки строковых литералов в стек времени выполнения, и эти коды операций указаны в спецификации JVM для работы путем помещения в стек соответствующего объекта String, содержимое которого равно некоторому строковому литералу, указанному в файл класса. Нет никакой спецификации для того, как это сделать, кроме того, что объект String должен быть интернирован, что означает, что преобразование зависит от реализации.

На уровне языка компилятор может обрабатывать любой литерал String, который он видит, как завершенный объект String для проверки типа, а затем может просто записать литерал и соответствующие байтовые коды в файл класса.

3 голосов
/ 24 марта 2011

В Java действительно есть несколько перегруженных операторов. Например, + может применяться к объектам String, а также к типам int, float и другим числовым типам. В каждом случае тип возвращаемого значения определяется типом выражения на каждой стороне +. Однако все перегруженные операторы предопределены в языке; у программистов нет никакого механизма в языке, чтобы определять любые другие. Подробности см. В спецификации языка .

0 голосов
/ 24 марта 2011

В основном компилятор переписывает ваш код.

String x = "Some String";

Для конкатенации это просто синтаксический сахар для метода добавления StringBuffer, то есть это:

z += " with some more in it";

компилируется как:

z = new StringBuffer(z).append(" with some more in it").toString();

Теперь для одного конкатата это объект, созданный и 2 вызова метода, поэтому, если вы строите очень длинную строку внутри цикла, FAR эффективнее написать:

StringBuilder buf = new StringBuilder(); // Not synchronized so quicker than StringBuffer
while ( condition is true )
    buf.append(...);
String z = buf.toString();

вместо:

String z = "";
while (condition is true)
   z += "...";

Редактировать: пример неправильного кода удален ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...