Java里面ArrayList用add添加的元素最后被覆盖,这是怎么回事?有高手告诉下吗?具体代码如下:

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java里面ArrayList用add添加的元素最后被覆盖,这是怎么回事?有高手告诉下吗?具体代码如下:相关的知识,希望对你有一定的参考价值。

public List<DemandDTO> findAll()
Iterator<Demand> demands=demandDAO.findAll().iterator();
demanddtos=new ArrayList<DemandDTO>();
demanddto=new DemandDTO();
while(demands.hasNext())

Demand demand=demands.next();
demanddto.setPkDemandId(demand.getPkDemandId());
demanddto.setPkDeptId(demand.getDept().getPkDeptId());
demanddto.setDeptName(demand.getDept().getDeptName());
demanddto.setDeptLeader(demand.getDept().getDeptLeader());
demanddto.setDemandFrom(demand.getDemandFrom());
demanddto.setDemandMan(demand.getDemandMan());
demanddto.setDemandName(demand.getDemandName());
demanddto.setDemandCount(demand.getDemandCount());
demanddto.setFitResumeNum(fitResumeNum(demand.getPkDemandId()));
demanddto.setSendResumeNum(sendResumeNum());
demanddto.setJoinInterviewNum(joinInterviewNum());
demanddto.setThroughInterviewNum(throughInterviewNum());
demanddto.setStartTime(demand.getStartTime());
demanddto.setEndTime(demand.getEndTime());
demanddto.setDemandState(demand.getDemandState());
demanddto.setDemandDes(demand.getDemandDes());
demanddtos.add(demanddto);

return demanddtos;


在循环体内用system.out.println(demanddtos.get(0).getDemandName)输出的结果是正确的,可以输出demanddtos里面的添加的DemandName,也就是说,都添加到0这个位置了,这是为什么啊?Arraylist的add方法不是添加的元素都是添加到末尾吗?

请楼主认真看一看demanddto这个对象。自始至终,demanddto只new了一个对象,无论demands循环了多少次,始终用了demanddto这一个对象,那个demanddtos.add(demanddto);这一句其实加的都是同一个对象,那么当然里面始终只有一个对象了。楼主应该这样:
while(demands.hasNext())

Demand demand=demands.next();
demanddto=new DemandDTO();
...
demanddtos.add(demanddto);

return demanddtos;
这样,每循环一次都new了一个对象,Arraylist才会不断把新对象加到末尾
参考技术A demanddto=new DemandDTO();
while(demands.hasNext())


调整为
while(demands.hasNext())

demanddto=new DemandDTO();

你在外面new, 由于地址永远不变,所以添加的始终是最后一个元素的内容
参考技术B 在Demand demand=demands.next();下面加一句demanddto=new DemandDTO();,你现在这样每次循环往list里里面放的都是同一个demanddto对象,只不过每次都重新给它的属性重新赋值了而已。 参考技术C demanddtos.add(demanddto);
添加的是对象,然后通过这个对象访问这些属性里的信息追问

我知道啊,demanddtos.get(0)不就是取出了它里面的对象吗?然后直接在后面加上用访问getDemandName方法啊

追答

可能我没理解你问的意思,你把每次循环都放到同一个对象里了

JAVA学习第九天

1.ArrayList集合中常用的方法

ArrayList<Student> stuArrayList = new ArrayList<>(); //定义一个集合对象

stuArrayList.add(); //添加元素

stuArrayList.add(index, e): //在某个位置添加元素,但不覆盖原元素

stuArrayList.get(index): //获取某位置的元素

stuArrayList.size(): //获取集合长度

stuArrayList.remove(""): //删除某元素

stuArrayList.remove(index): //删除某位置元素

stuArrayList.set(index,e): //用e覆盖某位置元素



2.一个问题点:

ArrayList<String> list = new ArrayList<>();

System.out.println(list);  //打印结果为空,并不是地址址,因为底层作了toString转换。


int []arr = new int[2];

syso(arr)://打印结果为内存地址


以上是关于Java里面ArrayList用add添加的元素最后被覆盖,这是怎么回事?有高手告诉下吗?具体代码如下:的主要内容,如果未能解决你的问题,请参考以下文章

一个arraylist,往里面add值的时候,遇到重复就不要添加,怎么做

c++ arraylist 怎么用

Java ArrayList如何在开头添加元素

java ArrayList数组中如何插入一个元素

List集合的add()方法

java中collection是啥?怎么理解?怎么使用?