Java性能:获取和设置列表

时间:2010-08-16 18:59:38

标签: java performance

任何人都能告诉我其中任何一个是否会比在Java 1.6下编译的其他任何一个更好?假设MyObject是一个有一个名为listField的字段的类,它有一个getter和setter

样品#1:

MyObject obj = new MyObject();
List<String> lst = new ArrayList<String>(1);
lst.add("Foo");
obj.setListField(lst);

样本#2:

MyObject obj = new MyObject();
obj.setListField(new ArrayList<String> (1));
obj.getListField().add("Foo");

我的想法是创建一个ArrayList的本地实例会产生内存开销,但是每当你想要添加到列表时调用getListField()都没有访问本地版本的列表那么快。也许如果有几个项目要添加到列表中,样本#1会更快但只有几个项目样本#2更快?或者编译器会对此进行优化,以便调用getListField()等同于访问列表的本地版本吗?

5 个答案:

答案 0 :(得分:9)

没有“本地实例”这样的东西。假设setListField()getListField()是微不足道的方法,那么这些样本之间几乎没有任何性能差异 - 如果任何。假设您正在使用HotSpot并且没有加载任何覆盖setListField或getListField的子类,我希望这些方法可以内联。

您需要了解当您致电setListField()时(再次,假设这是一个微不足道的实现),您不会创建列表的副本,或类似的东西。您只是将引用传递给列表对象。然后将该引用复制到该字段中。非常便宜。同样地,我希望getListField()只需将字段的值 - 引用返回到列表中。唯一被复制的是引用 - 可能是4或8个字节,具体取决于您的JVM。

就个人而言,第一个样本对我来说看起来更干净,但你应该集中精力去理解这里发生的事情,而不是表现。

答案 1 :(得分:0)

IMO编译器足够聪明,可以优化这两者,并且根本没有任何区别。

答案 2 :(得分:0)

卡梅伦

为什么要创建一个ArrayList并将其明确地调整为1个元素?如果它中永远不会有超过1个元素,请不要使用List - 如果可以的话,您的性能将会因列表大小调整而被破坏。你提出的问题,imho,是一个非问题。

答案 3 :(得分:0)

我认为要考虑的是为什么要创建只包含一个元素的数组列表。这样,当您向该列表添加新元素时,必须扩展内部数组,我认为这要差得多。

默认情况下,ArrayList s设置为10个元素。

答案 4 :(得分:0)

相同数量的new's =&gt;同样的表现。

除非分析显示这是一个瓶颈,否则你不应该担心这个