一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java新特性之for循環最全的用法總結

java新特性之for循環最全的用法總結

2020-07-20 13:33jingxian Java教程

下面小編就為大家帶來一篇java新特性之for循環最全的用法總結。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

1. 增強for概述

增強for循環,也叫Foreach循環,用于數組和容器(集合類)的遍歷。使用foreach循環遍歷數組和集合元素時,無需獲得數組和集合長度,無需根據索引來訪問數組元素和集合元素,大大提高的效率,代碼也簡潔不少。

2. Oracle官網的解釋

So when should you use the for-each loop? Any time you can. It really beautifies your code. Unfortunately, you cannot use it everywhere. Consider, for example, the expurgate method. The program needs access to the iterator in order to remove the current element. The for-each loop hides the iterator, so you cannot call remove. Therefore, the for-each loop is not usable for filtering. Similarly it is not usable for loops where you need to replace elements in a list or array as you traverse it. Finally, it is not usable for loops that must iterate over multiple collections in parallel. These shortcomings were known by the designers, who made a conscious decision to go with a clean, simple construct that would cover the great majority of cases.

所以你應該什么時候使用for-each循環?任何時候都可以。這真的美化你的代碼。不幸的是,你不能在任何地方使用它。考慮這些情況,例如,刪除方法。為了移除當前的元素,該程序需要訪問迭代器。for-each循環隱藏了迭代器,所以你不能調用刪除功能。因此,for-each循環不適用于過濾元素。同樣當遍歷集合或數組時需要替換元素的循環也是不適用的。最后,它不適用于多個集合迭代中并行循環使用。設計師應該了解這些缺陷,有意識地設計一個干凈,簡單的構造,來避免這些情況。有興趣的可以查看官網的API,如果不知道怎么在官網找到API,請點擊打開官網查看API方法。

3. 增強for格式

?
1
2
3
4
5
for(集合或者數組元素的類型 變量名 : 集合對象或者數組對象){
 
引用變量名的java語句;
 
}

 

官網解釋:


for (TimerTask t : c)
t.cancel();

When you see the colon (:) read it as “in.” The loop above reads as “for each TimerTask t in c.” As you can see, the for-each construct combines beautifully with generics. It preserves all of the type safety, while removing the remaining clutter. Because you don't have to declare the iterator, you don't have to provide a generic declaration for it. (The compiler does this for you behind your back, but you need not concern yourself with it.)

大意為:

當你看到冒號(:),它讀作“進來。”上述循環讀作“把c中的每個TimerTask元素進行遍歷。”正如你所看到的,for-each結構完美的與泛型結合。它保留了所有類型的安全性,同時去除剩余的混亂。因為你不必聲明迭代器,你不必為它提供一個泛型的聲明。 (編譯器在你背后已經做了,你不需要關心它。)


簡單體驗下:

1. 增強for遍歷數組

?
1
2
3
4
5
6
7
8
9
10
package cn.jason01;
//增強for遍歷數組
public class ForTest01 {
 public static void main(String[] args) {
 int[] array={1,2,3};
 for(int element: array){
 System.out.println(element);
 }
 }
}

 

2.增強for遍歷集合

 

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
package cn.jason01;
 
import java.util.ArrayList;
 
public class ForTest {
 public static void main(String[] args) {
 // 泛型推斷,后面可以寫可以不寫String
 ArrayList<String> array = new ArrayList();
 array.add("a");
 array.add("b");
 array.add("c");
 for (String string : array) {
 System.out.println(string);
 }
 
 }
}

 

4. 增強for底層原理

先看代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
package cn.jason01;
 
import java.util.ArrayList;
import java.util.Iterator;
 
/**
 * 增強for底層原理
 *
 * @author cassandra
 * @version 1.1
 */
public class ForTest {
    public static void main(String[] args) {
        // 泛型推斷,后面可以寫可以不寫String.規范一些是要寫上的。
        ArrayList<String> array = new ArrayList();
        // 添加元素
        array.add("a");
        array.add("b");
        array.add("c");
 
        // 增強for實現
        System.out.println("----enhanced for----");
        for (String string : array) {
            System.out.println(string);
        }
 
        // 反編譯之后的效果,也就是底層實現原理
        System.out.println("---reverse compile---");
        String string;
        for (Iterator iterator = array.iterator(); iterator.hasNext(); System.out.println(string)) {
            string = (String) iterator.next();
 
        }
 
        // 迭代器實現
        System.out.println("------Iterator------");
        for (Iterator<String> i = array.iterator(); i.hasNext(); System.out.println(i.next())) {
 
        }
 
        // 普通for實現
        System.out.println("-----general for-----");
        for (int x = 0; x < array.size(); x++) {
            System.out.println(array.get(x));
        }
    }
}

從上面代碼可以看出,底層是由迭代器實現的,增強for實際上是隱藏了迭代器,所以不用創建迭代器自然代碼簡潔不少。這也是增強for推出的原因,就是為了減少代碼,方便遍歷集合和數組,提高效率。

注意:正因為增強for隱藏了迭代器,所以用增強for遍歷集合和數組時,要先判斷是否為null,否則會拋出空指針異常。原因很簡單,底層需要用數組或者集合對象去調用iterator()方法去創建迭代器(Iterator迭代器是一個接口,所以要用子類來實現),如果是null,肯定拋出異常。

5. 增強for的適用性以及局限性

1.適用性

適用于集合和數組的遍歷。

2.局限性:

①集合不能為null,因為底層是迭代器。

②隱藏了迭代器,所以在遍歷集合時不能對集合進行修改(增刪)。

③不能設置角標。

6.增強for用法詳解

1.增強for在數組中用法

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
package cn.jason05;
 
import java.util.ArrayList;
import java.util.List;
 
/**
 * 增強for用法
 *
 * @author cassandra
 */
public class ForDemo {
 public static void main(String[] args) {
 // 遍歷數組
 int[] arr = { 1, 2, 3, 4, 5 };
 for (int x : arr) {
 System.out.println(x);
 }
 }
}

2.增強for在集合中用法

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package cn.jason05;
 
import java.util.ArrayList;
import java.util.List;
 
/**
 * 增強for用法
 *
 * @author cassandra
 */
public class ForDemo {
 public static void main(String[] args) {
 // 遍歷集合
 ArrayList<String> array = new ArrayList<String>();
 array.add("hello");
 array.add("world");
 array.add("java");
 
 for (String s : array) {
 System.out.println(s);
 }
 
 // 集合為null,拋出NullPointerException空指針異常
 List<String> list = null;
 if (list != null) {
 for (String s : list) {
 System.out.println(s);
 }
 }
 
 // 增強for中添加或修改元素,拋出ConcurrentModificationException并發修改異常
 for (String x : array) {
 if (array.contains("java"))
 array.add(1, "love");
 }
 
 }

3.泛型與增強for完美結合

注意:必須要與泛型完美結合,不然還得手動向下轉型

1.沒有泛型效果,不能使用增強for

Student類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
package cn.jason01;
 
public class Student {
 private String name1;
 private String name2;
 
 public Student() {
 super();
 }
 
 public Student(String name1, String name2) {
 super();
 this.name1 = name1;
 this.name2 = name2;
 }
 
 public String getName1() {
 return name1;
 }
 
 public void setName1(String name1) {
 this.name1 = name1;
 }
 
 public String getName2() {
 return name2;
 }
 
 public void setName2(String name2) {
 this.name2 = name2;
 }
 
}

測試代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
package cn.jason01;
 
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
 
public class Test02 {
 public static void main(String[] args) {
 // 創建集合1
 List list1 = new ArrayList();
 list1.add("a");
 list1.add("b");
 list1.add("c");
 
 // 創建集合2
 List list2 = new ArrayList();
 list2.add("d");
 list2.add("e");
 list2.add("f");
 // 創建集合三
 List list3 = new ArrayList();
 
 // 遍歷第一和第二個集合,并添加元素到集合三
 for (Iterator i = list1.iterator(); i.hasNext();) {
 // System.out.println(i.next());
 String s = (String) i.next();
 for (Iterator j = list2.iterator(); j.hasNext();) {
 // list2.add(new Student(s,j.next()));
 String ss = (String) j.next();
 list3.add(new Student(s, ss));
 }
 }
 
 // 遍歷集合三,并輸出元素
 Student st;
 for (Iterator k = list3.iterator(); k.hasNext(); System.out
 .println(new StringBuilder().append(st.getName1()).append(st.getName2()))) {
 st = (Student) k.next();
 }
 }
}

上面的代碼如果去掉注釋的兩行代碼,程序就會報錯,因為集合沒有聲明元素是什么類型,迭代器自然也不知道是什么類型。所以沒有泛型,那么就要向下轉型,只能用迭代器,不能用增強for。

2.泛型與增強for

泛型修改上面代碼

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
package cn.jason01;
 
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
 
/**
 * 增強for和泛型完美結合
 *
 * @author cassandra
 */
public class Test03 {
 public static void main(String[] args) {
 // 創建集合1
 List<String> list1 = new ArrayList<String>();
 list1.add("a");
 list1.add("b");
 list1.add("c");
 
 // 創建集合2
 List<String> list2 = new ArrayList<String>();
 list2.add("d");
 list2.add("e");
 list2.add("f");
 // 創建集合三
 List<Student> list3 = new ArrayList<Student>();
 
 //// 遍歷第一和第二個集合,并添加元素到集合三
 for (String s1 : list1) {
 for (String s2 : list2) {
 list3.add(new Student(s1, s2));
 }
 }
 
 // 遍歷集合三,并輸出元素
 for (Student st : list3) {
 System.out.println(new StringBuilder().append(st.getName1()).append(st.getName2()));
 }
 }
}

4.List集合遍歷四種方法

Collection接口中有iterator()方法,返回的是Iterator類型,有一個迭代器為Iterator。List中有listIterator()方法,所以多了一個集合器ListIterator,其子類LinkedList、ArrayList、Vector都實現了List和Collection接口,所以都可以用兩個迭代器遍歷。

代碼測試

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
package cn.jason05;
 
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.ListIterator;
 
/**
 * 這是List集合遍歷四種方法
 *
 * @author cassandra
 */
 
public class ForDemo01 {
 public static void main(String[] args) {
 // 創建集合
 List<String> list = new ArrayList<String>();
 list.add("hello");
 list.add("world");
 list.add("java");
 
 // 方法1,Iterator迭代器遍歷
 Iterator<String> i = list.iterator();
 while (i.hasNext()) {
 String s = i.next();
 System.out.println(s);
 }
 
 // 方法2,ListIterator迭代器遍歷集合
 ListIterator<String> lt = list.listIterator();
 while (lt.hasNext()) {
 String ss = lt.next();
 System.out.println(ss);
 }
 
 // 方法3,普通for遍歷集合
 for (int x = 0; x < list.size(); x++) {
 String sss = list.get(x);
 System.out.println(sss);
 }
 
 // 方法4,增強for遍歷集合
 for (String ssss : list) {
 System.out.println(ssss);
 }
 
 }
}

5.Set集合遍歷2中方法

由于Set集合沒有get(int index)方法,所以沒有普通for循環,Set中沒有listIterator()方法,所以沒有ListIterator迭代器。所以只有兩種遍歷方式。

代碼測試

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package cn.jason05;
 
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
 
public class ForTest03 {
 public static void main(String[] args) {
 Set<String> set = new HashSet<String>();
 set.add("hello");
 set.add("world");
 set.add("java");
 
 // 方法1,Iterator迭代器遍歷集合
 Iterator<String> it = set.iterator();
 while (it.hasNext()) {
 System.out.println(it.next());
 }
 
 // 方法2,增強for遍歷集合
 for (String s : set) {
 System.out.println(s);
 }
 
 }
}

7.歸納總結

1.增強for的適用性以及局限性

適用性:適用于集合和數組的遍歷。

局限性:

①集合不能為null,因為底層是迭代器。

②不能設置角標。

③隱藏了迭代器,所以在遍歷集合時不能對集合進行修改(增刪)。

2.在集合中增強for與泛型結合,才能發揮新特性的作用。

3.查看官網新特性挺重要的,要知其然還要知其所以然,了如心中,才能運用自如。

以上這篇java新特性之for循環最全的用法總結就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持服務器之家。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 久久国产主播福利在线 | 激情小视频网站 | 毛片亚洲毛片亚洲毛片 | 高清视频在线播放ww | 午夜影院免费观看视频 | 亚洲国产在线视频精品 | 国产综合久久久久久 | 亚洲精品视频在线免费 | 色偷偷伊人| 国产精品一区二区三 | 青青草原国产 | 久久国产36精品色熟妇 | 国产剧情麻豆刘玥视频 | 国产精品久久久久毛片真精品 | 大桥未久midd—962在线 | 嫩草香味| 多人群p全肉小说 | 动漫a级片 | 四虎一影院区永久精品 | 日本在线观看免费观看完整版 | 亚洲精品国产一区二区三区在 | 欧美美女被爆操 | 狠狠婷婷综合缴情亚洲 | bbox撕裂bass孕妇 | 男人午夜禁片在线观看 | 波多野结衣在线看 | 9420高清完整版在线观看国语 | 99热资源 | 2020国产精品亚洲综合网 | 91久久精品青青草原伊人 | 黄a 大片a v 永久免费 | 国产91精品区 | 青苹果乐园影院在线播放 | 男人天堂视频网 | 操碰97| 免费被黄网站在观看 | 精品一区二区三区 不卡高清 | 五月色婷婷久久综合 | 大学生初次破苞免费视频 | 国产麻豆传媒在线观看 | 农夫成人网 |