Mảng (Array) trong Java
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ả:
Array Length=5
myArray[3]=27
Element 0 = 10
Element 1 = 14
Element 2 = 36
Element 3 = 27
Element 4 = 18
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ả
Array Length=5
myArray[3] = 903
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ụ:
Apple
Apricot
Banana
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:
- Hướng dẫn và ví dụ Java Arrays
* 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);
}
}
}
Year: 1994
Year: 1995
Year: 2000
Year: 2001
Year: 2017
Years: [1994, 1995, 2000, 2001, 2017]
Name: Tom
Name: Jerry
Name: Donald
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]);
}
}
}
}
Length of myArray: 2
myArray[0,0]=0
myArray[0,1]=0
myArray[0,2]=0
myArray[1,0]=0
myArray[1,1]=0
myArray[1,2]=0
---
myArray[0,0]=1
myArray[0,1]=2
myArray[0,2]=3
myArray[1,0]=2
myArray[1,1]=4
myArray[1,2]=6
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]);
}
}
}
}
Team count: 2
Us Players count:3
Vn Players count:2
Player at[0][0]=Sam
Player at[0][1]=Smith
Player at[0][2]=Robert
Player at[1][0]=Tran
Player at[1][1]=Nguyen
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]);
}
}
}
}
Player at[0][0]=Sam
Player at[0][1]=Smith
Player at[0][2]=Robert
Player at[1][0]=Tran
Player at[1][1]=Nguyen
Java cơ bản
- Tùy biến trình biên dịch java xử lý Annotation của bạn (Annotation Processing Tool)
- Lập trình Java theo nhóm sử dụng Eclipse và SVN
- Hướng dẫn và ví dụ Java WeakReference
- Hướng dẫn và ví dụ Java PhantomReference
- Hướng dẫn nén và giải nén trong Java
- Cấu hình Eclipse để sử dụng JDK thay vì JRE
- Phương thức String.format() và printf() trong Java
- Cú pháp và các tính năng mới trong Java 5
- Cú pháp và các tính năng mới trong Java 8
- Hướng dẫn sử dụng biểu thức chính quy trong Java
- Hướng dẫn lập trình đa luồng trong Java - Java Multithreading
- Thư viện điều khiển các loại cơ sở dữ liệu khác nhau trong Java
- Hướng dẫn sử dụng Java JDBC kết nối cơ sở dữ liệu
- Lấy các giá trị của các cột tự động tăng khi Insert một bản ghi sử dụng JDBC
- Hướng dẫn và ví dụ Java Stream
- Functional Interface trong Java
- Giới thiệu về Raspberry Pi
- Hướng dẫn và ví dụ Java Predicate
- Abstract class và Interface trong Java
- Access modifier trong Java
- Hướng dẫn và ví dụ Java Enum
- Hướng dẫn và ví dụ Java Annotation
- So sánh và sắp xếp trong Java
- Hướng dẫn và ví dụ Java String, StringBuffer và StringBuilder
- Hướng dẫn xử lý ngoại lệ trong Java - Java Exception Handling
- Hướng dẫn và ví dụ Java Generics
- Thao tác với tập tin và thư mục trong Java
- Hướng dẫn và ví dụ Java BiPredicate
- Hướng dẫn và ví dụ Java Consumer
- Hướng dẫn và ví dụ Java BiConsumer
- Bắt đầu với Java cần những gì?
- Lịch sử của Java và sự khác biệt giữa Oracle JDK và OpenJDK
- Cài đặt Java trên Windows
- Cài đặt Java trên Ubuntu
- Cài đặt OpenJDK trên Ubuntu
- Cài đặt Eclipse
- Cài đặt Eclipse trên Ubuntu
- Học nhanh Java cho người mới bắt đầu
- Lịch sử của bit và byte trong khoa học máy tính
- Các kiểu dữ liệu trong Java
- Các toán tử Bitwise
- Câu lệnh rẽ nhánh (if else) trong Java
- Câu lệnh rẽ nhánh switch trong Java
- Vòng lặp trong Java
- Mảng (Array) trong Java
- JDK Javadoc định dạng CHM
- Thừa kế và đa hình trong Java
- Hướng dẫn và ví dụ Java Function
- Hướng dẫn và ví dụ Java BiFunction
- Ví dụ về Java encoding và decoding sử dụng Apache Base64
- Hướng dẫn và ví dụ Java Reflection
- Hướng dẫn gọi phương thức từ xa với Java RMI
- Hướng dẫn lập trình Java Socket
- Các nền tảng nào bạn nên chọn để lập trình ứng dụng Java Desktop?
- Hướng dẫn và ví dụ Java Commons IO
- Hướng dẫn và ví dụ Java Commons Email
- Hướng dẫn và ví dụ Java Commons Logging
- Tìm hiểu về Java System.identityHashCode, Object.hashCode và Object.equals
- Hướng dẫn và ví dụ Java SoftReference
- Hướng dẫn và ví dụ Java Supplier
- Lập trình Java hướng khía cạnh với AspectJ (AOP)
Show More
- Hướng dẫn lập trình Java Servlet/JSP
- Các hướng dẫn Java Collections Framework
- Java API cho HTML & XML
- Các hướng dẫn Java IO
- Các hướng dẫn Java Date Time
- Các hướng dẫn Spring Boot
- Các hướng dẫn Maven
- Các hướng dẫn Gradle
- Các hướng dẫn Java Web Services
- Các hướng dẫn lập trình Java SWT
- Các hướng dẫn lập trình JavaFX
- Các hướng dẫn Java Oracle ADF
- Các hướng dẫn Struts2 Framework
- Các hướng dẫn Spring Cloud