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

最近在写接口的时候用到了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);
   }
 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值