可变初始化

时间:2011-02-21 01:11:07

标签: java variables initialization

这是一种更有效的方式来声明电影对象,在循环内部还是在每次迭代时分配新值?

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);
}

3 个答案:

答案 0 :(得分:3)

我不认为效率是关键点。关键点是正确性

这两个片段不同的东西

  • 第一个版本使用不同的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);
}

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

答案 1 :(得分:2)

除非您希望列表仅包含对单个Movie对象的多个引用,否则最好在for循环内初始化Movie对象。这与效率无关,而与无错编码无关。随意在循环之前或之内声明Movie对象。

答案 2 :(得分:1)

效率,第二个,因为它不必每次调用和执行构造函数。

为了正确,你可能想要第一个,因为第二个给你很多次列表中的同一个对象。