Java性能:获取和设置列表

Cam*_*ron 2 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);
Run Code Online (Sandbox Code Playgroud)

样品#2:

MyObject obj = new MyObject();
obj.setListField(new ArrayList<String> (1));
obj.getListField().add("Foo");
Run Code Online (Sandbox Code Playgroud)

我的想法是,ArrayList的一个本地实例的创建将创建内存开销,但调用getListField()每当你想添加到列表是不一样快访问列表的本地版本.也许,如果有要添加到列表中的几个项目,样品#1是快,但只有少数项目样本#2是更快?或将编译器优化这一点,以便调用getListField()等效于访问列表的本地版本?

Jon*_*eet 9

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

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

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

  • @Cameron:可能不是,实际上 - 因为JIT编译器可能会内联它.很难说,但它几乎肯定不会是你代码中的瓶颈.这是重要的事情:首先编写*cleanest*代码,并测量其性能.*如果*你找到了瓶颈,那就微优化一下. (2认同)