java迭代時修改迭代器中物件引用地址無效
阿新 • • 發佈:2021-11-24
無論是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修改年齡,則可以生效,因為原物件在集合中存在引用地址,且這個地址沒有變化。