在Java中将元素添加到列表中的最有效方法是什么?

时间:2015-07-06 19:42:11

标签: java performance list memory-efficient

今天在工作中,我与2位开发人员讨论了将元素添加到列表中的方法。他们告诉我这是更有效的方式:

final FileInfo fileInfo = new FileInfo();
for (GroupInfo groupInfo : cft.getGroupFiles()) {
    fileInfo.setClassName(groupInfo.getClassGeneration());
    fileInfo.setFileId(groupInfo.getId().getCfgFileTypeId());
    fileInfoList.add(fileInfo);
}

但我总是以略微不同的方式完成它:

for (GroupInfo groupInfo : cft.getGroupFiles()) {
    FileInfo fileInfo = new FileInfo();
    fileInfo.setClassName(groupInfo.getClassGeneration());
    fileInfo.setFileId(groupInfo.getId().getCfgFileTypeId());
    fileInfoList.add(fileInfo);
}

那么,最有效的方法是什么?为什么?我认为第一种方式使用的内存少于第二种方式,但第二种方式生成一个新实例,一个实例,一个新的内存引用,然后将其添加到列表中,但我在使用第一种方式时遇到了错误的经验我不得不使用第一种方式转换或使用列表中的一些元素......所以,你能帮助我吗?谢谢!

2 个答案:

答案 0 :(得分:1)

在第一个示例中,您正在进行变异,然后添加FileInfo相同实例。因此,您最终将fileInfoList引用FileInfo的相同实例,该实例将具有最后一次循环迭代的状态。我很确定这不是理想的行为。像往常一样,正确性取代了效率。

答案 1 :(得分:0)

下面的列表只有一个元素:

final FileInfo fileInfo = new FileInfo();
for (GroupInfo groupInfo : cft.getGroupFiles()){
    fileInfo.setClassName(groupInfo.getClassGeneration());
    fileInfo.setFileId(groupInfo.getId().getCfgFileTypeId());
    fileInfoList.add(fileInfo);
}

以下将有cft.getGroupFiles()列表中的多个。

final FileInfo fileInfo = new FileInfo();
for (GroupInfo groupInfo : cft.getGroupFiles()){
    FileInfo fileInfo = new FileInfo();
    fileInfo.setClassName(groupInfo.getClassGeneration());
    fileInfo.setFileId(groupInfo.getId().getCfgFileTypeId());
    fileInfoList.add(fileInfo);
}

因此,我们无法在内存效率的基础上比较这两种方法,因为每种方法都是不同的实现方式。