关于list遍历的一点理解

** 编码过程中遍历list遇到问题的一点思考 **

我的代码里大致逻辑是这样的

public static void main(String[] args) {
        List<UserP> list= new ArrayList<>();
        UserP s1 = new UserP("s1", 1);
        UserP s2 = new UserP("s2", 2);
        UserP s3 = new UserP("s3", 3);
        list.add(s1);
        list.add(s2);
        list.add(s3);
        System.out.println(list);
        for (UserP userP : list) {
            userP = new UserP("s4",4);
        }
        System.out.println(list);

    }

输出结果是这样的
在这里插入图片描述
你会发现二次结果都一样,数据并没有被修改。那么是什么原因呢?
解析:
for循环中 userP其实就是for循环中的局部变量,并不是集合list中的元素。仅仅是将元素的引用给了userP。
而userP = new UserP(“s4”,4);(等价于UserP s5=new UserP(“s4”,4);userP=s5;)
这一行是将s5这个新对象的引用给了userP,并未改变list中的任何数据。
注:这里面的理解难点就是引用的问题,在C语言里叫指针

  • 延伸 * 关于for循环修改数据的问题
  1. fori循环可以修改,删除和增加list的值,
    注意:增加和删除会导致list长度发生变化。
    一个修改的例子如下:
public static void main(String[] args) {
        List<UserP> list= new ArrayList<>();
        UserP s1 = new UserP("s1", 1);
        UserP s2 = new UserP("s2", 2);
        UserP s3 = new UserP("s3", 3);
        list.add(s1);
        list.add(s2);
        list.add(s3);
        System.out.println(list);
        for (int i = 0; i < list.size(); i++) {
            list.set(i,new UserP("s4",4));
        }
        System.out.println(list);

    }

结果:
在这里插入图片描述

2.foreach 循环不能修改,删除,增加 list的值,可以修改引用对象的值

public static void main(String[] args) {
        List<UserP> list= new ArrayList<>();
        UserP s1 = new UserP("s1", 1);
        UserP s2 = new UserP("s2", 2);
        UserP s3 = new UserP("s3", 3);
        list.add(s1);
        list.add(s2);
        list.add(s3);

        System.out.println(list);
        for (UserP userP : list) {
            userP.setName("ss2");
        }
        System.out.println(list);

    }

结果:
在这里插入图片描述
3.利用迭代器可以实现删除,不能删除和修改。同样的也可以对引用对象修改

public static void main(String[] args) {
        List<UserP> list= new ArrayList<>();
        UserP s1 = new UserP("s1", 1);
        UserP s2 = new UserP("s2", 2);
        UserP s3 = new UserP("s3", 3);
        list.add(s1);
        list.add(s2);
        list.add(s3);

        System.out.println(list);
        Iterator<UserP> iterator = list.iterator();
        while (iterator.hasNext()){
            iterator.next();//注意:如果不写这一句会报错
            iterator.remove();
        }
        System.out.println(list);

    }
	结果:

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值