如何选择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的区别:
-
ListIterator有add()方法,可以向List中添加对象,而Iterator不能
-
ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以。
-
ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能。
-
都可实现删除对象,但是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遍历集合的方式的主要内容,如果未能解决你的问题,请参考以下文章