Home 成长之路 增强for、for、迭代器的区别

增强for、for、迭代器的区别

0 84

For循环和Foreach的区别

for(元素类型  元素名称 : 遍历数组(集合)(或者能进行迭代的)){

}

  foreach虽然是for循环的简化版本,但是并不是说foreach就比for更好用,foreach适用于循环次数未知,或者计算循环次数比较麻烦情况下使用效率更高,但是更为复杂的一些循环还是需要用到for循环效率更高。

另外foreach不支持在循环中添加删除操作因为在使用foreach循环的时候数组(集合)就已经被锁定不能被修改,否则会报出java.util.ConcurrentModificationException异常

Foreach使用限制场景:

1.使用foreach来遍历集合时,集合必须是实现Iterator接口,foreach就是使用Iterator接口来实现对集合的遍历的;

2.在用foreach循环遍历一个集合时不能向集合中增加或删除元素,否则会抛出ConcurrentModificationException异常;抛出该异常是因为在集合内部有一个modCount(模式数量可理解为元素个数)的值,每次遍历元素时都会判断该变量是否发生变化了变化,如果发生了变化则抛出ConcurrentModificationException异常;

3.当使用foreach循环基本类型变量时不能修改集合中的元素的值,遍历对象时可以修改对象的属性的值,但是不能修改对象的引用;

修改基本类型的值(原集合中的值没有变化,因为str是集合中变量的一个副本):

 

 

 

总结如下:

Foreach适用于只在集合或数组中进行遍历,for则在较复杂的循环中效率更高

Foreach不能对集合或者数组中的元素进行添加和删除操作,因此需要修改元素(添加,删除)则需要使用for循环

 

Iterator与泛型搭配:
Iterator对集合类中的任何一个实现类,都可以返回这样一个Iterator对象。可以适用于任何一个类。

因为集合类(List和Set等)可以装入的对象的类型是不确定的,从集合中取出时都是Object类型,用时都需要进行强制转化,这样会很麻烦,用上泛型,就是提前告诉集合确定要装入集合的类型,这样就可以直接使用而不用显示类型转换.非常方便.

foreach和Iterator的关系:
for each以用来处理集合中的每个元素而不用考虑集合定下标。就是为了让用Iterator简单。但是删除的时候,区别就是在remove,循环中调用集合remove会导致原集合变化导致错误,而应该用迭代器的remove方法。

使用for循环还是迭代器Iterator对比:

采用ArrayList对随机访问比较快,而for循环中的get()方法,采用的即是随机访问的方法,因此在ArrayList里,for循环较快

采用LinkedList则是顺序访问比较快,iterator中的next()方法,采用的即是顺序访问的方法,因此在LinkedList里,使用iterator较快

从数据结构角度分析,for循环适合访问顺序结构,可以根据下标快速获取指定元素.而Iterator 适合访问链式结构,因为迭代器是通过next()和Pre()来定位的.可以访问没有顺序的集合.

使用 Iterator 的好处在于可以使用相同方式去遍历集合中元素,而不用考虑集合类的内部实现(只要它实现了 java.lang.Iterable 接口),如果使用 Iterator 来遍历集合中元素,一旦不再使用 List 转而使用 Set 来组织数据,那遍历元素的代码不用做任何修改,如果使用 for 来遍历,那所有遍历此集合的算法都得做相应调整,因为List有序,Set无序,结构不同,他们的访问算法也不一样.(还是说明了一点遍历和集合本身分离了)

参考链接:https://blog.csdn.net/Jae_Wang/article/details/80526216

 

补充 使用迭代器删除是最安全的,使用for循环可能会漏删,使用增强for会报异常 :ConcurrentModificationException异常(理由如上)。

参考https://blog.csdn.net/czx2018/article/details/84770921

SIMILAR ARTICLES

发表评论

发表评论