1. Vòng lặp for trong Java

Vòng lặp for là cấu trúc điều khiển lặp được dùng để thực hiện một lệnh hay một khối lệnh với số lần lặp được xác định trước. Vì vậy cấu trúc lặp này rất mạnh và có thể sử dụng rất linh động trong nhiều tình huống khi viết chương trình. Nó cũng là vòng lặp mà ta hay gặp nhiều nhất đấy.

Cú pháp :

for ([biểu_thức_1]; [biểu_thức_2]; [biểu_thức_3]) {
    // Các lệnh
}
// Lệnh kế tiếp

Trong đó:

  • biểu_thức_1 là biểu thức tính ra giá trị khởi đầu cho biến của for
  • biểu_thức_2 là biểu thức tính ra giá trị điều kiện lặp của for
  • biểu_thức_3 là bước nhảy của biến sau mỗi lần lặp
  • Các lệnh là lệnh thực hiện trong thân của vòng lặp for

Ví dụ:

public class Main {
  public static void main(String[] args) {
    for (int i = 0; i < 5; i++) {
      System.out.println(i);
    }  
  }
}

Kết quả

0
1
2
3
4

2. Nguyên lý hoạt động của vòng lặp for

Đầu tiên giá trị của biểu thức 1 được khởi tạo và nó sẽ chỉ được thực thi một lần duy nhất. Sau đó sẽ kiểm tra điều kiện lặp. Nếu đúng (true) thì các dòng lệnh trong vòng lặp sẽ được thực hiện. Nếu điều kiện sai (false) thì kết thúc vòng lặp. Biểu thức bước nhảy sẽ làm thay đổi giá trị của biến ban đầu. Sau khi đã thực hiện bước nhảy thì giá trị mới sẽ được kiểm tra lại với điều kiện lặp ban đầu. Cứ như vậy đến khi kết thúc vòng lặp

Ví dụ: in ra câu Lập Trình Từ Đầu 5 lần

class Main {
    public static void main(String[] args) {
        int n = 5;
        // for loop  
        for (int i = 1; i <= n; ++i) {
          System.out.println("Lập Trình Từ Đầu");
        }
    }
}

Kết quả

Lập Trình Từ Đầu
Lập Trình Từ Đầu
Lập Trình Từ Đầu
Lập Trình Từ Đầu
Lập Trình Từ Đầu

Lưu ý

Các biểu thức trong for có thể có hoặc không. Nhưng bắt buộc phải có dấu chấm phẩy ; . Mỗi biểu thức trong cấu trúc for có thể là một hoặc nhiều biểu thức đơn. Nếu trong trường hợp một biểu thức có nhiều biểu thức đơn thì các biểu thức đơn được viết cách nhau bởi dấu phẩy , và các biểu thức đơn đó được thực hiện từ trái qua phải.

3. Các dạng thường gặp của for trong Java

3.1. Vòng lặp for không có giá trị khởi đầu và bước nhảy

Trong trường hợp này vòng lặp for sẽ không khác gì vòng lặp while .

Ví dụ:

int sum = 0, k = 1;
for (; sum < 100; ) {
    sum += k;
    k++;
}

3.2. Vòng lặp for không có giá trị khởi đầu

Nếu chúng ta đã khởi tạo biến đếm ở ngoài vòng lặp for thì biểu thức khởi tạo có thể được rút gọn.

Ví dụ:

public class Main {
 public static void main(String[] args) {
    int i = 0;
    for (; i < 2; i++){
  	System.out.println("i=" + i);
        }
   }
}

Kết quả

i=0
i=1

3.3. Vòng lặp for không có điều kiện

Trong trường hợp không cần thiết phải kiểm tra điều kiện để kết thúc vòng lặp, chúng ta có thể lược bỏ biểu thức điều kiện, và tạo ra một vòng lặp vô hạn trong Java.  Lúc đó, trong thân của vòng lặp phải có lệnh để thoát ra ngoài vòng for (chi tiết về phần này sẽ giới thiệu trong bài sau).

Ví dụ:

public class Main {
 public static void main(String[] args) {
    int sum = 0;
    for (int i = 1; ; i++){
 	 sum += i;
  	if (sum > 5){
  	  break;
  	  }
    }
    System.out.println("sum = " + sum);
    //sum = 6
 }
}

Kết quả

sum = 6

3.4. Vòng lặp for trống rỗng

Vòng lặp for lúc này sẽ không có cả 3 biểu thức. Khi đó thân của vòng lặp sẽ được thực hiện liên tục. Lúc đó, trong thân của vòng lặp phải có lệnh để thoát ra ngoài vòng for (chi tiết về phần này tôi sẽ giới thiệu trong bài sau).

for (;;) {
    // các lệnh
    // lưu ý: phải có lệnh để thoát ra ngoài vòng lặp
}

4. Vòng lặp for lồng nhau trong Java

Trong khối lệnh for được xác định bởi cặp dấu {} , thông thường chúng ta sẽ viết các lệnh xử lý của vòng lặp. Ngoài viết các lệnh ra, chúng ta cũng có thể viết một vòng for khác ở bên trong vòng for đó, để tạo ra for lồng trong Java ( for trong for ).

Ví dụ, chúng ta có một for lồng nhau

public class Main {
 public static void main(String[] args) {
    for (int i = 1; i < 4; i++){
    	for (int j = 1; j < 4; j++){
      	System.out.println("i = " + i + ", j = " + j);
    	}
    }
 }
}

Tại vòng for lồng này, cứ mỗi khi vòng for ngoài (biến i) chạy 1 lần thì vòng for trong (biến j) sẽ được chạy 3 lần. Và vòng for ngoài được chạy 3 lần nên tổng lại sẽ có 3×3 bằng 9 vòng for sẽ được thực thi như sau:

i = 1, j = 1
i = 1, j = 2
i = 1, j = 3
i = 2, j = 1
i = 2, j = 2
i = 2, j = 3
i = 3, j = 1
i = 3, j = 2
i = 3, j = 3

Khác với vòng lặp for trong Java với những trường hợp ở phần trên, thì trong for lồng các biến đếm không được thay đổi cùng lúc. Mà sẽ thay đổi theo cặp kết hợp giữa các vòng trong và vòng ngoài.

Hay một ví dụ khác

class Main {
    public static void main(String[] args) {
        int sum = 0;
        for (int i = 1; i <= 10; --i) {
            System.out.println("Lập trình từ đầu");
        }
    }
}

5. Vòng lặp for each trong Java

For each trong Java hay còn được gọi là Enhanced for hoặc vòng lặp for mở rộng. Nó là một cách viết đặc biệt của vòng lặp for , có tác dụng thực hiện các vòng lặp với từng phần tử trong các mảng và collection Set , List ,… trong Java. Điểm đặc biệt nhất của for each đó chính là chúng ta không cần sử dụng tới index của các phần tử trong mảng hay collection đó, mà vẫn có thể truy xuất tới các phần tử, cũng như là duyệt mảng hoặc collection trong Java.

Trong các ngôn ngữ lập trình khác cũng tồn tại vòng lặp for each mà chúng ta sẽ viết trực tiếp cụm từ for each trong cú pháp. Tuy nhiên trong Java, chúng ta sẽ không dùng dùng trực tiếp cụm từ for each khi viết lệnh, mà sẽ dùng cú pháp sau đây:

for ( type variable : collection){
    //code
}

Trong đó:

  • type là kiểu dữ liệu
  • variable là tên biến dùng để gán từng giá trị phần tử được lấy ra
  • collection là tên collection hoặc mảng mà chúng ta cần làm việc

Vòng lặp for each hoạt động theo nguyên tắc lấy từng phần tử từ collection , gán vào variable , rồi dùng variable để thực hiện các tính toán trong khối.

Ví dụ:

class Main {
    public static void main(String[] args) {
        // create an array
        int[] numbers = {3, 9, 5, -5};

        // for each loop 
        for (int number: numbers) {
          System.out.println(number);
        }
    }
}

Kết quả

3
9
5
-5

Vòng lặp forfor each cho kết quả duyệt mảng như nhau, nhưng for each ngắn gọn và dễ hiểu hơn.

Một ví dụ về việc xuất phần tử trong mảng

class Main {
  public static void main(String[] args) {
    String[] IT = {"Java", "PHP", "JS", "Python"};
    for (String i : IT) {
      System.out.println(i);
    }    
  }
}

Kết quả

Java
PHP
JS
Python