我有一个关于在java中创建新对象的问题。
让我们说我有一个叫做foo(String[] a)
我想传递给foo
一个新的String[]
那只是为了一次使用而不是
表现1或2
1
String[] a = new String[]{"a"};
foo(a);
2
foo(new String[]{"a"});
感谢您的帮助
答案 0 :(得分:8)
您可以检查字节码:
1
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: anewarray #2 // class java/lang/String
4: astore_1
5: aload_1
6: invokestatic #3 // Method foo:([Ljava/lang/String;)V
9: return
2
public static void main(java.lang.String[]);
Code:
0: iconst_0
1: anewarray #2 // class java/lang/String
4: invokestatic #3 // Method foo:([Ljava/lang/String;)V
7: return
唯一的区别是在(2)中,没有存储引用(astore_1
),也不需要加载任何引用(aload_1
)。这几乎肯定不会导致性能差异(你不应该担心这种微小的优化),但如果你不打算在程序中再次引用a
,你也可以使用选项(2)。 (正如您在your comment中提到的)和没有可读性侵权。
我认为可读性组件非常重要:我宁愿创建一个变量来存储数组(即使我永远不会多次引用这个变量),而不是一条超长,不可读的行。当然,在您的示例中,可读性没有问题,但在出现更复杂的情况时需要考虑这个问题。
答案 1 :(得分:3)
如果您使用临时局部变量 可以来帮助提高性能,那么使用它们来存储经常使用的,代价高昂的计算值。对于一次性值,它们仍然可以帮助命名一个值并明确其意图 - 而且这个性能成本绝对可以忽略不计。
拥有或不拥有用于存储一次性值的变量在性能方面无关紧要,请将您的工作集中在由分析器突出显示为瓶颈的代码部分,并且不要浪费您的时间在这样的无关紧要微优化。编写易于理解的代码更为重要,请记住......“过早优化是万恶之源。”
答案 2 :(得分:1)
我认为不可能以一般方式明确回答这个问题。甚至arshajii的回应显示IL是有限的。
在您的代码中,JIT编译器无论如何都会优化它。
优化级别将在很大程度上取决于版本,平台,实现和一百万个其他变量。
...现在,如果你在两者之间有一个阅读围栏,那么抖动无法将它们优化掉,那么你会有不同的故事。