Во время выполнения
В Java 9+ во время выполнения объединение строк являетсяконтролируется классом StringConcatFactory
( javadoc ). Это потому, что javac
генерирует invokedynamic
байт-код для StringConcatFactory :: makeConcat` везде, где требуется конкатенация строк.
StringConcatFactory
определяет несколько стратегий для выполнения конкатенации в виде Strategy
enum ( исходный код ).
Вы можете изменить стратегию по умолчанию из командной строки, установив -Djava.lang.invoke.stringConcat
Чтобы получить поведение Java-8 во время выполнения,вам нужно установить его на BC_SB
, что означает "Bytecode, StringBuilder"
Вот другие значения для полноты:
/**
* Bytecode generator, calling into {@link java.lang.StringBuilder}.
*/
BC_SB,
/**
* Bytecode generator, calling into {@link java.lang.StringBuilder};
* but trying to estimate the required storage.
*/
BC_SB_SIZED,
/**
* Bytecode generator, calling into {@link java.lang.StringBuilder};
* but computing the required storage exactly.
*/
BC_SB_SIZED_EXACT,
/**
* MethodHandle-based generator, that in the end calls into {@link java.lang.StringBuilder}.
* This strategy also tries to estimate the required storage.
*/
MH_SB_SIZED,
/**
* MethodHandle-based generator, that in the end calls into {@link java.lang.StringBuilder}.
* This strategy also estimate the required storage exactly.
*/
MH_SB_SIZED_EXACT,
/**
* MethodHandle-based generator, that constructs its own byte[] array from
* the arguments. It computes the required storage exactly.
*/
MH_INLINE_SIZED_EXACT