繁体   English   中英

变量初始化

[英]Variable initialisation

在循环内还是在每次迭代外部分配新值时,哪种更有效的方法来声明影片对象?

ArrayList<Movie> localMovies = new ArrayList<Movie>();    
for (File file : listOfFiles) {
    Movie movie = new Movie();
    movie.setTitlePattern(filePattern);
    localMovies.add(movie);
}

要么

ArrayList<Movie> localMovies = new ArrayList<Movie>();
Movie movie = new Movie();    
for (File file : listOfFiles) {
    movie.setTitlePattern(filePattern);
    localMovies.add(movie);
}

我认为效率不是这里的重点。 关键是正确性

这两个片段执行不同的操作

  • 第一个版本使用不同的Movie对象填充列表。

  • 第二个版本使用对单个Move对象的多个引用填充列表。 然后,您继续更改该对象的标题模式。 因此,当循环结束时,您将有N个对同一对象的引用,并且该对象的标题模式将是最后一组。

尽管没有更多的上下文无法确定,但是第二个版本看起来不正确……它没有执行您要尝试执行的操作(我认为)。


话虽如此,代码的“不正确”版本可能会快一些。 差异是否显着(值得担心)取决于上下文。 无论如何,这个问题还没有解决。

如果要比较这两个“正确”版本的性能:

ArrayList<Movie> localMovies = new ArrayList<Movie>();    
for (File file : listOfFiles) {
    Movie movie = new Movie();
    movie.setTitlePattern(filePattern);
    localMovies.add(movie);
}

ArrayList<Movie> localMovies = new ArrayList<Movie>();  
Movie movie;  
for (File file : listOfFiles) {
    movie = new Movie();
    movie.setTitlePattern(filePattern);
    localMovies.add(movie);
}

极有可能没有可检测到的差异。

最好在for循环中初始化Movie对象,除非您希望列表仅包含对一个Movie对象的多个引用。 这与效率无关,而与无错误编码有关。 可以在循环之前或循环内部声明Movie对象。

为了提高效率,第二个代码因为不必每次都调用和执行构造函数。

但是,为了正确起见,您可能需要第一个对象,因为第二个对象会多次为您提供列表中的同一对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM