往List中添加对象的时候前面的数据总被最后加入的覆盖

阅读更多

最近在写接口的时候用到了List,但是发现每次输出的结果都是同一条数据,而且是最后一题。看了下查询出来的结果,都是正确的,经过一步步调试发现在将查出来的结果放到List的时候出了问题。

   File fileinfo=new File();
   ArrayList list=new ArrayList();
  
   FileStatus[] status2 = fs.listStatus(path);  
   Path[] listedPaths = FileUtil.stat2Paths(status2);
   ...
   for (Path p : listedPaths) {
     fileinfo.setFilesize(Integer.valueOf(String.valueOf(filesize)));
     fileinfo.setAuthority(tempfs.getPermission().toString());
     ...
     list.add(fileinfo);
   }

 fileinfo是一个对象,for循环第一次为他设置了一些值,然后将这个对象添加到List中。List里面现在存放了一个该对象;

接着进行第二次循环,要注意, File fileinfo=new File();是在for循环外面,也就是说,我们用的还是第一次用的那个对象。 因为是同一个对象,所以用的是同一个内存空间,后面的内容会覆盖前面的内容,所以现在该对象的值已经是现在的新的内容,当最后把这个对象放到List的时候,其实是将同一个对象又放了一遍,而且这个对象的内容已经发生改变(最后一次加进去的内容)。
所以第二次循环之后,该List里面是已经有两个对象了,但是这两个对象其实是同一个对象(可以理解为添加了两遍),其内容是一致的。
解决方法:就是每次循环创建一个对象,然后将对象添加到List中即可。
即每次循环都创建一个File对象:
   File fileinfo=new File();
   ...
   for (Path p : listedPaths) {
     fileinfo=new File();
     ...
     list.add(fileinfo);
   }
 

你可能感兴趣的:(java,List)