往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); }
上一篇: 往List中添加对象的时候前面的数据总被最后加入的覆盖 javaList
下一篇: 20160426