如何选择Java遍历集合的方式

Posted 覃会程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何选择Java遍历集合的方式相关的知识,希望对你有一定的参考价值。

文章目录

foreach的使用注意点

  • foreach遍历可以修改元素中的值(修改对象中的属性),但如果修改引用的指向是无效的,因为foreach相当于是拷贝引用,然后进行遍历。
  • 遍历过程中不能添加和删除元素,否则会报ConcurrentModificationException异常。
    @Test
    void test5()
        // foreach遍历可以修改元素中的值,但如果修改引用的指向是无效的,因为foreach相当于是拷贝引用,然后进行遍历
        // 遍历过程中不能添加和删除元素,否则会报ConcurrentModificationException异常。
        ArrayList<User> users = new ArrayList<>();
        User user1 = new User();
        user1.setUsername("测试");
        user1.setPassword("123456");
        User user2 = new User();
        user2.setUsername("测试2");
        user2.setPassword("6666666");
        User user3 = new User();
        user3.setUsername("测试3");
        user3.setPassword("9999999");
        users.add(user1);
        users.add(user2);
        users.forEach(user -> 
            users.add(user3);
        );
        users.forEach(user -> 
            System.out.println(user);
        );
    

for(User user: users)的用法也具有相同的特性。

想要在遍历的使用删除元素可以使用迭代器的方式进行遍历

Iterator<User> iterator = users.iterator();
while(iterator.hasNext())
    User next = iterator.next();
    if ("测试".equals(next.getUsername()))
    iterator.remove();

注意:

这里使用的是iterator,而不是ListIterator,可以删除元素,但是不能添加元素,并且修改对象的引用也是无效的。

iterator和ListIterator的区别:

  1. ListIterator有add()方法,可以向List中添加对象,而Iterator不能

  2. ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。

  3. ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。

  4. 都可实现删除对象,但是ListIterator可以实现对象的修改(修改引用的指向),set()方法可以实现。Iierator仅能遍历,不能修改。

因为ListIterator的这些功能,可以实现对LinkedList等List数据结构的操作。其实,数组对象也可以用迭代器来实现。

添加元素:

ListIterator<User> userListIterator = users.listIterator();
while(userListIterator.hasNext())
    User next = userListIterator.next();
    if ("测试".equals(next.getUsername()))
        //会添加到当前对象的下一位置
        userListIterator.add(user3);

修改引用的指向:

ListIterator<User> userListIterator = users.listIterator();
while(userListIterator.hasNext())
    User next = userListIterator.next();
    userListIterator.set(user3);

总结:

如果仅仅是遍历,或只是修改元素中的值(对象的属性),这些遍历方式都可以

如果需要删除元素,可以使用Iierator

如果需要修改对象的引用或者添加元素(对象),要使用ListIterator

以上是关于如何选择Java遍历集合的方式的主要内容,如果未能解决你的问题,请参考以下文章

Java Map遍历方式的选择

JAVA集合01_Collection接口概述常用方法集合和数组互转3种遍历方式

Java中Map集合的三种遍历方式

Java 实例 - 集合遍历

遍历 Java 集合以使这些球反弹,有啥提示吗?

精髓!Java中遍历Map集合的五种方式