Я ожидаю, что код JITted будет примерно таким же. В байт-коде есть дополнительное хранилище / загрузка для первой формы, но я был бы очень удивлен, увидев, что это имеет реальное значение. Преимущество первой формы в том, что она облегчает отладку, но в то же время делает код более подробным.
РЕДАКТИРОВАТЬ: я первоначально написал, что оба создают один и тот же байт-код, но это не так:
public class Test {
static void separate() {
String x = "hello";
String y = x.toString();
foo(y);
}
static void combined() {
String x = "hello";
foo(x.toString());
}
static void foo(String x) {
}
}
Компилируется в (только методы separate
и combined
):
static void combined();
Code:
0: ldc #2; //String hello
2: astore_0
3: aload_0
4: invokevirtual #3; //Method java/lang/String.toString:()Ljava/lang/String;
7: invokestatic #4; //Method foo:(Ljava/lang/String;)V
10: return
static void separate();
Code:
0: ldc #2; //String hello
2: astore_0
3: aload_0
4: invokevirtual #3; //Method java/lang/String.toString:()Ljava/lang/String;
7: astore_1
8: aload_1
9: invokestatic #4; //Method foo:(Ljava/lang/String;)V