Mảng (Array) trong Java

Xem thêm các chuyên mục:

1- Mảng là gì?

Trong Java, mảng (array) là một tập hợp các phần tử có cùng kiểu dữ liệu, có địa chỉ tiếp nhau trên bộ nhớ (memory). Mảng có số phần tử cố định và bạn không thể thay đổi kích thước của nó.
Các phần tử của mảng được đánh chỉ số (index), bắt đầu từ chỉ số 0. Bạn có thể truy cập vào các phần tử của nó thông qua chỉ số.
Hãy xem một hình ảnh mảng  5 phần tử, chứa các số int.
Ngoài các mảng 1 chiều, đôi khi bạn cũng phải làm việc với mảng 2 chiều hoặc nhiều chiều. Một mảng 2 chiều, các phần tử của nó sẽ được đánh hai chỉ số, chỉ số hàng và chỉ số cột. Dưới đây là hình ảnh một mảng 2 chiều.
 

2- Mảng một chiều

Cách khai báo một mảng trong Java.
** Syntax **
// Khai báo một mảng, chưa chỉ rõ số phần tử.
int[] array1;

// Khởi tạo mảng với 100 phần tử
// Các phần tử chưa được gán giá trị cụ thể
array1 = new int[100];

// Khai báo một mảng, và chỉ rõ số phần tử
// Các phần tử chưa được gán giá trị cụ thể
double[] array2 = new double[10];

// Khai báo một mảng với các phần tử được gán giá trị cụ thể.
// Mảng này có 4 phần tử
long[] array3= {10L, 23L, 30L, 11L};
Hãy xem một ví dụ:
ArrayExample1.java
package org.o7planning.tutorial.javabasic.array;

public class ArrayExample1 {

	public static void main(String[] args) {

		// Khai báo một mảng 5 phần tử
		int[] myArray = new int[5];

		// Chú ý: phần tử đầu tiên của mảng có chỉ số là 0:
		// Gán giá trị cho phần tử đầu tiên (Chỉ số 0)
		myArray[0] = 10;

		// Gán giá trị cho phần tử thứ hai (Chỉ số 1)
		myArray[1] = 14;

		myArray[2] = 36;
		myArray[3] = 27;

		// Giá giá trị cho phần tử thứ 5 (Phần tử cuối cùng trong mảng)
		myArray[4] = 18;

		// In ra màn hình Console số phần tử của mảng.
		System.out.println("Array Length=" + myArray.length);

		// In ra phần tử tại chỉ số 3 (Phần tử thứ 4 trong mảng)
		System.out.println("myArray[3]=" + myArray[3]);

		// Sử dụng vòng lặp for để in ra các phần tử trong mảng.
		for (int index = 0; index < myArray.length; index++) {
			System.out.println("Element " + index + " = " + myArray[index]);
		}
	}

}
Kết quả:
Một ví dụ minh họa tiếp sử dụng vòng lặp for để gán giá trị cho các phần tử:
ArrayExample2.java
package org.o7planning.tutorial.javabasic.array;

public class ArrayExample2 {

	public static void main(String[] args) {

		// Khai báo một mảng 5 phần tử
		int[] myArray = new int[5];

		// In ra màn hình Console số phần tử của mảng.
		System.out.println("Array Length=" + myArray.length);

		// Sử dụng vòng lặp for để gán giá trị cho các phần tử của mảng.
		for (int index = 0; index < myArray.length; index++) {
			myArray[index] = 100 * index * index + 3;
		}

		// In ra màn hình Console phần tử tại chỉ số 3
		System.out.println("myArray[3] = " + myArray[3]);
	}

}
Kết quả

3- Mảng 1 chiều và vòng lặp for-each

Java 5 cung cấp cho bạn vòng lặp for-each, vòng lặp này giúp bạn duyệt qua (traverse) tất cả các phần tử của mảng mà không cần sử dụng biến chỉ số.
Ví dụ:
ArrayForeachExample.java
package org.o7planning.tutorial.javabasic.array;

public class ArrayForeachExample {

	public static void main(String[] args) {

		// Khai báo một mảng các String.
		String[] fruits = new String[] { "Apple", "Apricot", "Banana" };

		// Sử dụng vòng lặp for-each để duyệt qua các phần tử của mảng.
		for (String fruit : fruits) {

			System.out.println(fruit);

		}

	}

}
Chạy ví dụ:

4- Các phương thức tiện ích cho mảng 1 chiều

Chú ý: Bạn cần có kiến thức về lớp và các phương thức trước khi xem mục này. Nếu không bạn có thể tạm thời bỏ qua nó.
Java cung cấp cho bạn một số phương thức tĩnh tiện ích dành cho mảng, chẳng hạn sắp xếp mảng, gán các giá trị cho toàn bộ các phần tử của mảng, tìm kiếm, so sánh mảng... Các phương thức này được định nghĩa trong lớp Arrays.
Dưới đây là một vài phương thức tĩnh, thực sự có ích được định nghĩa trong lớp Arrays. Các phương thức này được áp dụng cho các mảng các phần tử có kiểu byte, char, double, float, long, int, short, boolean
Xem thêm:
  • TODO Link!
* Arrays *
// Truyền vào các tham số cùng kiểu, và trả về một danh sách (List).
public static <T> List<T> asList(T... a)

// Kiểu X có thể là: byte, char, double, float, long, int, short, boolean
----------------------

// Tìm kiếm chỉ số của một giá trị xuất hiện trong mảng.
// (Sử dụng thuật toán tìm kiếm nhị phân (binary search))
public static int binarySearch(X[] a, X key)

// Copy các phần tử của một mảng để tạo ra một mảng mới với độ dài chỉ định.
public static int[] copyOf(X[] original, X newLength)

// Copy một phạm vi chỉ định các phần tử của mảng để tạo một mảng mới
public static double[] copyOfRange(X[] original, int from, int to)

// So sánh hai mảng
public static boolean equals(X[] a, long[] a2)

// Gán cùng một giá trị cho tất cả các phần tử của mảng.
public static void fill(X[] a, X val)

// Chuyển một mảng thành chuỗi (string)
public static String toString(X[] a)
Ví dụ dưới đây sử dụng một vài phương thức tiện ích của lớp Arrays.
ArraysExample.java
package org.o7planning.tutorial.javabasic.array;

import java.util.Arrays;
import java.util.List;

public class ArraysExample {

	public static void main(String[] args) {

		int[] years = new int[] { 2001, 1994, 1995, 2000, 2017 };

		// Sắp xếp
		Arrays.sort(years);

		for (int year : years) {
			System.out.println("Year: " + year);
		}

		// Chuyển một mảng thành chuỗi
		String yearsString = Arrays.toString(years);

		System.out.println("Years: " + yearsString);

		// Tạo danh sách (List) từ một vài giá trị.
		List<String> names = Arrays.asList("Tom", "Jerry", "Donald");

		for (String name : names) {
			System.out.println("Name: " + name);
		}

	}

}

5- Mảng hai chiều

Rất thường xuyên, bạn phải làm việc với một mảng, thông thường là làm việc với một mảng 1 chiều, tuy nhiên trong trường hợp bạn muốn làm việc với một dữ liệu dạng bảng, với nhiều cột và nhiều dòng, mảng 2 chiều nên được sử dụng. Ví dụ mảng 2 chiều sẽ giúp bạn lưu trữ thông tin các quân cờ trên một bàn cờ.
Các dòng và các cột của mảng 2 chiều được đánh chỉ số 0, 1, 2,.... Để truy cập vào 1 phần tử của mảng 2 chiều bạn cần truy cập theo 2 chỉ số: chỉ số dòng và chỉ sổ cột.
length là một thuộc tính (property) của mảng, trong trường hợp mảng 2 chiều, thuộc tính này chính là số dòng của mảng.
Bạn có 3 cách để khai báo một mảng 2 chiều.
// Khai báo một mảng có 5 dòng, 10 cột
MyType[][] myArray1 = new MyType[5][10]; 

// Khai báo một mảng 2 chiều có 5 dòng.
// (Mảng của mảng)
MyType[][] myArray2 = new MyType[5][]; 

// Khai báo một mảng 2 chiều, chỉ định giá trị các phần tử. 
MyType[][] myArray3 = new MyType[][] {

    { value00, value01, value02 , value03 }, 
    { value10, value11, value12 } 
};

// ** Chú ý:
// MyType có thể là các kiểu nguyên thủy (byte, char, double, float, long, int, short, boolean)
// hoặc là kiểu tham chiếu.
Nếu bạn khai báo một mảng của kiểu nguyên thủy ( byte, char, double, float, long, int, short, boolean), các phần tử không được chỉ định giá trị, chúng sẽ có giá trị mặc định
  • Giá trị mặc định 0 ứng với các kiểu byte, double, float, long, int, short.
  • Giá trị mặc định false ứng với kiểu boolean.
  • Giá trị mặc định '\u0000' (Ký tự null) ứng với kiểu char.
Ngược lại, nếu bạn khai báo một mảng của kiểu tham chiếu, nếu một phần tử của mảng không được chỉ định giá trị, nó sẽ có giá trị mặc định là null.
Ví dụ:
TwoDimensionalExample1.java
package org.o7planning.tutorial.javabasic.array;

public class TwoDimensionalExample1 {

	public static void main(String[] args) {

		// Khai báo một mảng 2 chiều với 2 dòng, 3 cột
		// Các phần tử có giá trị mặc định
		int[][] myArray = new int[2][3];
		
		// Số dòng của mảng 2 chiều.
		System.out.println("Length of myArray: "+ myArray.length); // ==> 2

		// Print out
		for (int row = 0; row < 2; row++) {

			for (int col = 0; col < 3; col++) {
				System.out.println("myArray[" + row + "," + col + "]=" + myArray[row][col]);
			}
		}
		System.out.println(" --- ");

		// Gán các giá trị cho các phần tử.
		for (int row = 0; row < 2; row++) {

			for (int col = 0; col < 3; col++) {
				myArray[row][col] = (row + 1) * (col + 1);
			}
		}

		// Print out
		for (int row = 0; row < 2; row++) {

			for (int col = 0; col < 3; col++) {
				System.out.println("myArray[" + row + "," + col + "]=" + myArray[row][col]);
			}
		}

	}

}

Mảng 2 chiều thực sự là một mảng của mảng.

Trong Java mảng 2 chiều thực sự là một mảng của mảng, vì vậy bạn có thể khai báo một mảng 2 chiều chỉ cần chỉ định số dòng, không cần phải chỉ rõ số cột. Chính vì mảng 2 chiều là "Mảng của mảng" nên thuộc tính length của mảng 2 chiều trả về số dòng của mảng.
TwoDimensionalExample2.java
package org.o7planning.tutorial.javabasic.array;

public class TwoDimensionalExample2 {

	public static void main(String[] args) {

		// Khai báo một mảng 2 chiều, chỉ rõ các phần tử của mảng.
		String[][] teamAndPlayers = new String[][] { 
			    { "Sam", "Smith", "Robert" }, // US Players
				{ "Tran", "Nguyen" }          // Vietnam Players
		};

		String[] usPlayers = teamAndPlayers[0];
		String[] vnPlayers = teamAndPlayers[1];
		
		System.out.println("Team count: " + teamAndPlayers.length); // ==> 2

		System.out.println("Us Players count:" + usPlayers.length); // ==> 3
		System.out.println("Vn Players count:" + vnPlayers.length); // ==> 2

		for (int row = 0; row < teamAndPlayers.length; row++) { 

			String[] players = teamAndPlayers[row];

			for (int col = 0; col < players.length; col++) {
				System.out.println("Player at[" + row + "][" + col + "]=" + teamAndPlayers[row][col]);
			}

		}

	}
}
Ví dụ:
TwoDimensionalExample3.java
package org.o7planning.tutorial.javabasic.array;

public class TwoDimensionalExample3 {

	public static void main(String[] args) {

	    // Khai báo một mảng 2 chiều (Mảng của mảng)
		// Có 2 dòng.
		String[][] teamAndPlayers = new String[2][];
		
		// US Players
		teamAndPlayers[0] = new String[]{ "Sam", "Smith", "Robert" };
		
		// Vietnam Players
		teamAndPlayers[1] = new String[]{ "Tran", "Nguyen" };
	 
  
		for (int row = 0; row < teamAndPlayers.length; row++) { 

			String[] players = teamAndPlayers[row];

			for (int col = 0; col < players.length; col++) {
				System.out.println("Player at[" + row + "][" + col + "]=" + teamAndPlayers[row][col]);
			}

		}

	}
}

Xem thêm các chuyên mục: