Java, строки и байткод

На работе один из членов нашей команды периодически кидает в общий чат вопросы провокационного характера, одним из которых был следующий: равнозначны ли следующие два примера кода?

Что бы ответить на этот вопрос необходимо заглянуть в байткод каждого класса

Как видим в строках 12 и 18 метода main из наших строк, которые мы конкатенировали, создались константы, о чем говорит инструкция ldc.

Посмотрим на байткод второго примера


Здесь уже создается StringBuilder в который сначала вставляется "str1", а затем по результату булевой переменной определяется вставлять ли "str2" или "str3". Ну и в конце добавляется "str4". Как видим в этом случае компилятор не смог создать две константы, т.к. конструкцию с тернарным оператором он посчитал за переменную. Проверим так ли это.

Как видно, байткод такой же, как и во втором примере.

P.S. Этот пример заставил меня задуматься, какой из способов создания строк быстрее? Контактенация через "+", String.concat() или работа через StringBuilder? Ответ на этот вопрос я нашел вот в этой интересной статье с которой и советую ознакомиться.

Comments

Popular posts from this blog

JEEConf 2017 How it was

Java 8 vs GoF: Strategy

Separate and rule your tests