欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-07-13 16:02:07
...

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

   File fileinfo=new File();
   ArrayList<File> list=new ArrayList<File>();
  
   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