代码之家  ›  专栏  ›  技术社区  ›  Cameron

Java性能:获取和设置列表

  •  2
  • Cameron  · 技术社区  · 15 年前

    有人能告诉我,如果在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 回复  |  直到 15 年前
        1
  •  9
  •   Jon Skeet    15 年前

    没有所谓的“本地实例”。假设 setListField() getListField() 是一些普通的方法,应该没有太大的性能差异-如果 任何 -在这些样品之间。假设您使用的是Hotspot,并且没有加载覆盖setListField或getListField的子类,那么我希望方法是内联的。

    你打电话的时候要明白 StistListField() (再一次,假设这是一个微不足道的实现)您没有创建列表的副本,或者类似的东西。你只是路过 参考 到列表对象。然后,该引用将被复制到字段中。非常便宜。我也希望如此 GETListField() 只返回字段的值-a 参考 列在列表中。唯一被复制的是一个引用——可能是4或8个字节,这取决于您的JVM。

    对于我个人来说,第一个示例看起来像更干净的代码,但是您应该集中精力理解这里所发生的事情,因为这比性能更重要。

        2
  •  0
  •   naikus    15 年前

    在我看来,编译器将足够聪明地优化这两个问题,而且不会有任何区别。

        3
  •  0
  •   Amir Afghani    15 年前

    卡梅伦

    为什么要创建一个arraylist并将其显式调整为1个元素?如果列表中的元素永远不会超过1个,则不要使用列表——如果列表中的元素超过1个,则列表的大小调整将影响您的性能。你提出的问题,imho,不是问题。

        4
  •  0
  •   Tom    15 年前

    我认为需要考虑的是,为什么只使用一个元素创建数组列表。这样,当您向该列表中添加新元素时,必须扩展内部数组,我认为这会更糟。

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

        5
  •  0
  •   Thorbjørn Ravn Andersen    15 年前

    相同数量的新产品=相同性能。

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