Java增强的for循环和普通for循环对比

本文详细介绍了Java5.0中增强for循环的使用方法、语法及应用场景,并指出了其在遍历数组和集合时的局限性,强调了根据实际需求选择性使用的必要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

JDK1.5中增加了增强的for循环。

缺点:
  对于数组,不能方便的访问下标值;
  对于集合,与使用Interator相比,不能方便的删除集合中的内容(在内部也是调用Interator).
除了简单遍历并读取其中的内容外,不建议使用增强的for循环。

一、遍历数组

语法为:

for (Type value : array) {
    expression value;
}

//以前我们这样写:

void someFunction ()
{
    int[] array = {1,2,5,8,9};
    int total = 0;
    for (int i = 0; i < array.length; i++)
    {
        total += array[i];
     }
    System.out.println(total);
 }

//现在我们只需这样写(和以上写法是等价的):

void someFunction ()
{
    int[] array = {1,2,5,8,9};
    int total = 0;
    for (int n : array)
   {  
       total += n;
    }
    System.out.println(total);
}

这种写法的缺点:

 显而易见,for/in(for each)循环自动控制一次遍历数组中的每一个元素,然后将它赋值给一个临时变量(如上述代码中的int n),然后在循环体中可直接对此临时变量进行操作。这种循环的缺点是:

 1. 只能顺次遍历所有元素,无法实现较为复杂的循环,如在某些条件下需要后退到之前遍历过的某个元素;

 2. 循环变量(i)不可见,如果想知道当前遍历到数组的第几个元素,只能这样写:

 int i = 0;
 for (int n : array) {
     System.out.println("This " + i + "-th element in the array is " + n);
     i++;
 }

二、遍历集合

 语法为:

for (Type value : Iterable) {
    expression value;
}

注意:for/in循环遍历的集合必须是实现Iterable接口的。

 1  //以前我们这样写:
 2 void someFunction ()
 3 {
 4     List list = new ArrayList();
 5     list.add("Hello ");
 6     list.add("Java ");
 7     list.add("World!");
 8     String s = "";
 9     for (Iterator iter = list.iterator(); iter.hasNext();)
10    {
11        String temp= (String) iter.next();
12        s += temp;
13     }
14     System.out.println(s);
15  }

 

 1 //现在我们这样写:
 2 
 3 void someFunction ()
 4 {
 5     List list = new ArrayList();
 6     list.add("Hello ");
 7     list.add("Java ");
 8     list.add("World!");
 9     String s = "";
10     for (Object o : list)
11    {
12        String temp = (String) o;
13        s += temp;
14    }
15    System.out.println(s);
16 }

 

 

 1 // 如果结合“泛型”,那么写法会更简单,如下:
 2  void someFunction ()
 3 {
 4     List list = new ArrayList();
 5     list.add("Hello ");
 6     list.add("Java ");
 7     list.add("World!");
 8     String s = "";
 9     for (String temp : list)
10    {
11        s += temp; //省去了对强制类型转换步骤
12    }
13    System.out.println(s);
14 }
15 //上述代码会被编译器转化为:
16  void someFunction ()
17 {
18     List list = new ArrayList();
19     list.add("Hello ");
20     list.add("Java ");
21     list.add("World!");
22     String s = "";
23     for (Iterator iter = list.iterator(); iter.hasNext(); )
24    {
25        String temp = iter.next();
26        s += temp;
27     }
28     System.out.println(s);
29  }

 

这种写法的缺点:

虽然对集合进行的for/in操作会被编译器转化为Iterator操作,但是使用for/in时,Iterator是不可见的,所以如果需要调用Iterator.remove()方法,或其他一些操作, for/in循环就有些力不从心了。 综上所述,Java 5.0中提供的增强的for循环——for/in(for each)循环能让我们的代码更加简洁,让程序员使用时更加方便,但是也有它的局限性,所以一定要根据实际需要有选择性地使用,不要盲目追求所谓的“新特性”。

 

<think>好的,用户问的是Javafor循环增强for循环的区别。首先,我需要回忆这两种循环的基本语法用法。 传统的for循环,我记得是使用初始化、条件判断迭代语句,比如for(int i=0; i<10; i++)。它可以灵活控制循环次数,也能通过索引访问数组或集合的元素。那增强for循环Java 5引入的,语法更简洁,比如for(String s : list),主要用于遍历数组或集合,不需要索引。 接下来,我需要比较它们的区别。首先,语法结构不同,传统for循环有三个部分,而增强型只有元素类型变量。然后适用场景,传统for适合需要索引或复杂控制的情况,比如逆序遍历或者间隔访问元素,而增强型适合简单的遍历。性能方面,增强型在遍历集合时可能会稍微慢一点,因为它用了迭代器,不过差别不大。另外,传统for可以修改集合,比如删除元素,而增强型在遍历时修改会抛出并发修改异常。 还要注意错误处理,传统for循环容易数组越界,增强型则不会。然后代码可读性方面,增强型更简洁。可能用户在实际使用中遇到的问题,比如为什么增强循环不能修改集合,或者什么时候该用哪种循环。 需要确保回答覆盖这些点,结构清晰,用例子说明。可能用户是刚开始学Java,所以需要解释清楚,避免术语太复杂。同时,检查语法是否正确,比如提到的异常类型是否正确,有没有遗漏关键点。最后,总结使用场景,帮助用户根据需求选择合适的方式。</think>Java中的传统`for`循环增强型`for`循环for-each循环)主要有以下区别: --- ### 1. **语法结构** - **传统for循环** 需要明确指定初始化、循环条件迭代操作: ```java for (初始化; 条件; 迭代操作) { // 代码块 } ``` 示例:遍历数组 ```java int[] arr = {1, 2, 3}; for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } ``` - **增强for循环** 语法更简洁,隐藏了索引/迭代器操作: ```java for (元素类型 变量 : 集合或数组) { // 代码块 } ``` 示例:遍历数组 ```java int[] arr = {1, 2, 3}; for (int num : arr) { System.out.println(num); } ``` --- ### 2. **适用场景** - **传统for循环** - 需要根据索引操作元素(如修改数组元素) - 需要逆向遍历(如 `i--`) - 需要灵活控制循环步长(如 `i += 2`) - 需要修改集合内容(如删除元素) - **增强for循环** - 仅需遍历集合/数组,不关心索引 - 代码简洁,避免手动处理迭代器 - **不可直接修改集合结构**(遍历时修改会抛出 `ConcurrentModificationException`) --- ### 3. **性能对比** - 对于数组遍历,二者性能接近(增强for循环底层转换为普通for循环)。 - 对于集合(如 `ArrayList`、`LinkedList`),增强for循环本质通过迭代器实现,效率与传统迭代器遍历一致。 - 若需要高频随机访问元素,传统for循环(通过索引)可能更高效(如 `ArrayList`)。 --- ### 4. **错误风险** - **传统for循环** 需手动处理索引边界,容易因索引越界导致 `ArrayIndexOutOfBoundsException`。 ```java for (int i = 0; i <= arr.length; i++) { // 错误:i <= arr.length System.out.println(arr[i]); } ``` - **增强for循环** 自动处理边界,避免越界错误。 --- ### 5. **代码可读性** - 增强for循环更简洁,适合简单遍历场景。 - 传统for循环灵活性高,适合复杂逻辑。 --- ### **总结选择建议** | **场景** | 推荐循环类型 | |-----------------------------|------------------| | 需要索引或修改元素 | 传统for循环 | | 简单遍历集合/数组 | 增强for循环 | | 逆向遍历或自定义步长 | 传统for循环 | | 需要遍历过程中修改集合结构 | 传统for循环或迭代器 | --- ### 示例对比 ```java // 传统for循环修改数组元素 int[] arr = {1, 2, 3}; for (int i = 0; i < arr.length; i++) { arr[i] *= 2; // 可以直接修改元素 } // 增强for循环无法修改原始数组(仅操作副本) for (int num : arr) { num *= 2; // 无效,不改变原数组 } ``` --- 通过理解两者的特性,可根据具体需求选择更合适的循环方式。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值