java中的add()_java中list.add()方法中的小细节

本文揭示了Java List中add()方法的隐藏细节,尤其是在处理对象引用时,如何导致元素覆盖而非新增。通过实例演示,学习如何避免对象引用导致的重复添加问题,以及何时使用内部重新实例化来确保独立的元素添加。
摘要由CSDN通过智能技术生成

list.add()中的小细节

最近在码代码的时候发现一个有趣的list问题,就是list中的add()方法和list中的add()方法会有点区别。

前者是和预想的一样,就是给集合按顺序添加元素,而后者在添加的时候会覆盖前面的元素。

例如:

list

public static void main(String[] args){

List list = new ArrayList();

list.add("第一个元素");

list.add("第二个元素");

list.add("第三个元素");

list.add("第四个元素");

//list.remove(1);

//通过foreach方式遍历所有元素

for (String element : list){

System.out.println("foreach遍历:" + element);

}

运行结果

a2b80b5f8b025a27990c33a5d39f9ef0.png

list

List cats = findCatByCatId(catid);

CatInfoDto catInfoDto = new CatInfoDto();

List catInfoDtos = new ArrayList<>();

for (Cat cat : cats){

catInfoDto.setCatid(cat.getId());

catInfoDto.setCatname(cat.getCatname());

catInfoDtos.add(catInfoDto);

}

每一次遍历,list中的内容都会被新的cat覆盖

查询资料发现,转递给add()方法的是catInfoDto类的引用,是一个内存地址,所以定义在外部for循环外部的对象的引用,在for循环的时候没有改变内存地址,所以添加到list的是同一个对象的地址,所以每次add都会覆盖掉前面的内容。

如果想不覆盖的话,在for循环内部再重新new一个catInfoDto类对象即可,这样每次循环都会重新在内存中开辟一段空间

List cats = findCatByCatId(catid);

CatInfoDto catInfoDto = new CatInfoDto();

List catInfoDtos = new ArrayList<>();

for (Cat cat : cats){

catInfoDto = new CatInfoDto();

catInfoDto.setCatid(cat.getId());

catInfoDto.setCatname(cat.getCatname());

catInfoDtos.add(catInfoDto);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值