Они разные, давайте посмотрим на байт-код:
1. версия :
L0
LINENUMBER 9 L0
ALOAD 0
ICONST_0
AALOAD
INVOKEVIRTUAL java/lang/String.getBytes ()[B
ARRAYLENGTH
NEWARRAY T_BYTE
ASTORE 1
L1
LINENUMBER 10 L1
ALOAD 0
ICONST_0
AALOAD
INVOKEVIRTUAL java/lang/String.getBytes ()[B
ASTORE 1
L2
LINENUMBER 11 L2
RETURN
L3
LOCALVARIABLE args [Ljava/lang/String; L0 L3 0
LOCALVARIABLE bytearr [B L1 L3 1
MAXSTACK = 2
MAXLOCALS = 2
2. версия :
L0
LINENUMBER 9 L0
ALOAD 0
ICONST_0
AALOAD
INVOKEVIRTUAL java/lang/String.getBytes ()[B
ASTORE 1
L1
LINENUMBER 10 L1
RETURN
L2
LOCALVARIABLE args [Ljava/lang/String; L0 L2 0
LOCALVARIABLE bytearr [B L1 L2 1
MAXSTACK = 2
MAXLOCALS = 2
Разница заключается в том, что инструкции выходят из дополнительной строки:
LINENUMBER 9 L0
ALOAD 0
ICONST_0
AALOAD
INVOKEVIRTUAL java/lang/String.getBytes ()[B
ARRAYLENGTH
NEWARRAY T_BYTE
ASTORE 1
Это приводит к дополнительным издержкам (getBytes
вызывается дважды, больше инструкций) , Вызывая bytearr = a.getBytes()
, jvm уже обрабатывает размер хранимого массива.
Но поскольку первая инициализация избыточна, она, вероятно, будет оптимизирована компилятором в некоторый момент (после достаточного количества запусков). Тем не менее, нет необходимости в дополнительных инструкциях и менее читаемом коде.