这是一种更有效的方式来声明电影对象,在循环内部还是在每次迭代时分配新值?
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);
}
答案 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)
效率,第二个,因为它不必每次调用和执行构造函数。
为了正确,你可能想要第一个,因为第二个给你很多次列表中的同一个对象。