zoukankan      html  css  js  c++  java
  • java迭代时修改迭代器中对象引用地址无效

    无论是foreach,还是iterator,在遍历时,修改实体对象的引用地址都是无效的

    foreach:

            List<User> userList = new ArrayList<>();
            userList.add(new User("ming", 11));
    
            for (User user : userList) {
                if ("ming".equals(user.getName())) {
                    user = new User("ming");
                    user.setAge(20);
                }
            }
            logger.info("{}", userList); // 11:55:41.059 [main] INFO com.demo.test.JUCT - [User [age=11, name=ming]]
        

    iterator:

            List<User> userList = new ArrayList<>();
            userList.add(new User("ming", 11));
    
            Iterator<User> iterator = userList.iterator();
            while (iterator.hasNext()) {
                User next = iterator.next();
                if ("ming".equals(next.getName())) {
                    next = new User("ming");
                    next.setAge(20);
                }
            }
    
            logger.info("{}", userList); // 11:36:32.918 [main] INFO com.demo.test.JUCT - [User [age=11, name=ming]]
        

    值修改:

            List<User> userList = new ArrayList<>();
            userList.add(new User("ming", 11));
    
            Iterator<User> iterator = userList.iterator();
            while (iterator.hasNext()) {
                User next = iterator.next();
                if ("ming".equals(next.getName())) {
                    next.setAge(20);
                }
            }
            logger.info("{}", userList); // 11:47:55.569 [main] INFO com.demo.test.JUCT - [User [age=20, name=ming]]
        

    其实也很容易理解,集合中保存的为引用地址,如果是直接再new User(),那这就是一个新的地址,其在集合中是不存在的,所以最后打印出来的userList中user的age还是11,但如果直接在原来的对象上执行setAge修改年龄,则可以生效,因为原对象在集合中存在引用地址,且这个地址没有变化。

  • 相关阅读:
    Java面向对象编程之异常处理机制
    LinkedList链式集合
    Java之反射机制
    适配器模式
    QuickHit
    Java之单例模式
    Java面向对象之接口
    多线程
    线程同步
    试题分析
  • 原文地址:https://www.cnblogs.com/qq931399960/p/15597496.html
Copyright © 2011-2022 走看看