Java, строки и байткод
На работе один из членов нашей команды периодически кидает в общий чат вопросы провокационного характера, одним из которых был следующий: равнозначны ли следующие два примера кода?
Что бы ответить на этот вопрос необходимо заглянуть в байткод каждого класса
Как видим в строках 12 и 18 метода main из наших строк, которые мы конкатенировали, создались константы, о чем говорит инструкция ldc.
Посмотрим на байткод второго примера
Здесь уже создается StringBuilder в который сначала вставляется "str1", а затем по результату булевой переменной определяется вставлять ли "str2" или "str3". Ну и в конце добавляется "str4". Как видим в этом случае компилятор не смог создать две константы, т.к. конструкцию с тернарным оператором он посчитал за переменную. Проверим так ли это.
Как видно, байткод такой же, как и во втором примере.
P.S. Этот пример заставил меня задуматься, какой из способов создания строк быстрее? Контактенация через "+", String.concat() или работа через StringBuilder? Ответ на этот вопрос я нашел вот в этой интересной статье с которой и советую ознакомиться.
Comments
Post a Comment