1. 程式人生 > 其它 >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修改年齡,則可以生效,因為原物件在集合中存在引用地址,且這個地址沒有變化。