Chào các bạn đã đến với chủ đề tiếp theo của mình. Hôm nay, mình sẽ tiếp tục giới thiệu về mảng 1 chiều và cách sử dụng nó trong Java. Ở bài này, mình sẽ đi qua những nội dung như sau:
Nội dung
1. Mảng là gì? Ưu nhược của mảng
1.1. Mảng là gì?
Mảng là tập hợp các đối tượng có cùng kiểu dữ liệu và được lưu trữ gần nhau trong bộ nhớ. Mỗi đối tượng hay được gọi là phần tử, các phần từ được phân biệt bằng vị trí (hay chỉ số phần tử), được bắt đầu từ vị trí 0.
Ví dụ như bạn lưu tuổi của 100 học viên trong lớp. Một cách để làm điều này là tạo 100 biến để lưu tuổi của từng học viên. Tuy nhiên, việc đó rất phiền và tốn thời gian. Thay vào đó, ta có thể tạo một mảng duy nhất và lưu tuổi của một trăm học viên cùng lúc.
Ví dụ:
int[] age = {24, 23, 18, 19, 20};
Trong đó:
age
– tên của mảng[]
– biểu thị đây là một mảng{24, 23, 18, 19, 20}
– các phần tử mảngint
– cho biết mảng chỉ có thể chứa các phần tử số nguyên.
1.2. Ưu nhược của mảng
Ưu điểm:
- Tối ưu code: Gom các phần tử liên quan vào chung một với nhau giúp code gọn gàng hơn.
- Có thể truy cập ngẫu nhiên: Do các vị trí ô lưu trữ liên tiếp ta có thể truy cập ngẫu nhiên bằng chỉ số phần tử dễ dàng và nhanh chóng.
- Dễ thao tác, quản lý và nâng cấp: Như muốn thay đổi các giá trị theo 1 quy luật thì ta sẽ tận dụng sử dụng những vòng lặp lập trình.
Nhược điểm:
- Giới hạn kích thước: Khi sử dụng mảng ta phải khai báo kích thước lưu trữ của mảng và không thể thay đổi kích thước trong lúc chạy.
- Vùng lưu trữ phải liên tiếp: Đây cũng là vừa ưu vừa nhược điểm. Vì yêu cầu các ô nhớ liên tiếp nên phải tốn không gian bộ nhớ, hoặc đủ ô nhớ nhưng các ô nhớ không tiếp nên không thể khai báo được.
2. Khai báo và add phần tử vào mảng
Để khai báo mảng 1 chiều, mình sẽ có 3 cách khai báo như sau:
2.1. Cách 1
Cú pháp:
<kiểu dữ liệu> [] <tên mảng>;
Sau khi khai báo xong, chúng ta cần cấp phát bộ nhớ để tạo mảng
<tên mảng> = new <kiểu dữ liệu>[kích cỡ mảng];
Ví dụ: Khai báo mảng có 3 phần tử, gán giá trị vào mảng. Thử in mảng a và các giá trị mảng a
public class MangMotChieu {
public static void main(String []args){
int[] a;
a = new int[3];
a[0] = 5;
a[1] = 2;
a[2] = 1;
System.out.println(a);
for (int i = 0; i < 3; i++){
System.out.println(a[i]);
}
}
}
Sau khi run xong, kết quả sẽ in ra như sau:
Ta thấy khi ta thử in ra mảng a thì nó cho kết quả [I@1b6d3586. Vì mảng không phải kiểu dữ liệu nguyên thủy, mảng là kiểu dữ liệu tham chiếu. Ý nghĩa kết quả như sau: [I có nghĩa đây là mảng thuộc kiểu int (tượng trưng bằng chữ I), @2a139a55 thì tùy thuộc JVM đưa ra, nhưng thường là địa chỉ lưu trữ đối tượng.
2.2. Cách 2
Cú pháp:
<kiểu dữ liệu> [] <tên mảng> = new <kiểu dữ liệu>[kích cỡ mảng];
Ở cách 1, chúng ta cần 2 dòng code để khởi tạo mảng và cấp phát bộ nhớ cho nó. Thì ở cách 2 này, mình chỉ cần 1 dòng code, khai báo rút gọn hơn và cấp phát bộ nhớ ngay khi khởi tạo mảng.
Ví dụ:
public class MangMotChieu {
public static void main(String []args){
int[] a = new int[3];
a[0] = 5;
a[1] = 2;
a[2] = 1;
System.out.println(a);
for (int i = 0; i < 3; i++){
System.out.println(a[i]);
}
}
}
2.3. Cách 3
Cú pháp:
<kiểu dữ liệu> [] <tên mảng> = {<giá trị>,…}
Như chúng ta thấy ở cách 1 và cách 2, để tạo mảng số nguyên, chúng ta cần khởi tạo mảng và cấp phát bộ nhớ cho nó. Sau đó, chúng ta bắt đầu gán giá trị vào mảng. Thì ở cách 3 này, khi chúng ta khởi tạo mảng, chúng ta gán giá trị luôn vào mảng đó.
Ví dụ 1: Khai báo mảng kiểu int
public class MangMotChieu {
public static void main(String []args){
int[] a = {24, 23, 18, 19, 20};
for (int i = 0; i < 5; i++){
System.out.println(a[i]);
}
}
}
Ví dụ 2: Khai báo mảng kiểu char
public class MangMotChieu {
public static void main(String []args){
char[] a = {'H', 'e', 'l', 'l','o',' ','W','o', 'r', 'l', 'd'};
System.out.print(a);
}
}
Sau khi run xong, kết quả sẽ in ra như sau:
Riêng kiểu dữ liệu char đặc biệt hơn là có thể in ra toàn bộ giá trị bằng cách print trực tiếp mảng.
3. Truy cập các phần tử mảng
Trong Java, mỗi phần tử của mảng được liên kết với một số gọi là chỉ số mảng. Chỉ số mảng xác định vị trí của phần tử bên trong mảng.
int[] age = {24, 23, 18, 19, 20};
Đối với mảng trên, chỉ số mảng có dạng như sau:
Chỉ số bắt đầu từ 0, vì vậy phần tử đầu tiên của mảng sẽ luôn ở vị trí 0.
Chúng ta sử dụng chỉ số mảng để truy cập các phần tử của mảng. Cách truy cập như sau:
// Get giá trị đầu tiên trong mảng
age[0];
// Get giá trị thứ 2 trong mảng
age[1];
Ta sử dụng tên mảng age
, theo sau là dấu ngoặc vuông []
với chỉ số index để truy cập các phần tử mảng.
Ví dụ:
class Main {
public static void main(String[] args) {
// create an array
int[] age = {24, 23, 18, 19, 20};
// access the first element
System.out.println(age[0]);
// access the second element
System.out.println(age[1]);
// access the third element
System.out.println(age[2]);
// access the fourth element
System.out.println(age[3]);
// access the fifth element
System.out.println(age[4]);
}
}
Sau khi chạy đoạn code trên, kết quả được in ra như sau:
24
23
18
19
20
4. Get số lượng phần tử trong mảng
Chúng ta hãy xét ở ví dụ sau:
int[] a = {24, 23, 18, 19, 20};
for (int i = 0; i < 5; i++){
System.out.println(a[i]);
}
Ở vòng lặp for trên, chúng ta sử dụng điều kiện dừng i < 5. Số 5 ở đây chính là số lượng phần tử trong mảng. Nhưng giả sử trong mảng có 1 số lượng lớn phần tử, việc đếm số phần tử trong mảng sẽ không phải là một giải pháp hiệu quả. Thay vào đó, chúng ta sẽ sử dụng thuộc tính length. Thuộc tính này sẽ tự động trả về tổng số lượng phần tử trong mảng mà chúng ta ko cần phải đếm.
Ví dụ:
class Main {
public static void main(String[] args) {
int[] numbers = {3, 4, 5, 6, 7, 8, 9};
// access element of the array using loop
for (int index = 0; index < numbers.length; index++) {
System.out.println(numbers[index]);
}
}
Sau khi run đoạn code trên, kết quả được in ra như sau:
3
4
5
6
7
8
9
Sử dụng thuộc tính length
làm cho vòng lặp for
linh hoạt hơn và bây giờ ta không cần phải đếm các phần tử nữa.
5. Thay đổi phần tử trong mảng
Ngoài việc gán giá trị vào mảng, chúng ta có thể thay đổi giá trị của nó. Ví dụ chúng ta có mảng sau:
int[] age = {24, 23, 18, 19, 20};
Bây giờ, chúng ta hãy thử đổi phần tử thứ hai từ 23 thành 28 và phần tử thứ tư từ 19 thành 21.
Chúng ta biết rằng chỉ số của phần tử thứ hai là 1 và chỉ số của phần tử thứ tư là 3, vì vậy ta sẽ gán một giá trị mới cho chỉ số đó.
class Main {
public static void main(String[] args) {
// create double array
int[] age = {24, 23, 18, 19, 20};
// change the value of second element
age[1] = 28;
// change the value of fourth element
age[3] = 21;
// access array using loop
for (int index = 0; index < 5; ++index) {
System.out.println(age[index]);
}
}
}
Sau khi run đoạn code trên, kết quả được in ra như sau:
24
28
18
21
20
Trong đó
age[1] = 28;
thay đổi giá trị của phần tử thứ hai thành 28age[3] = 21;
thay đổi giá trị của phần tử thứ tư thành 21
6. Kết
Như vậy chúng ta đã tìm hiểu xong mảng 1 chiều và cách sử dụng trong Java. Cảm ơn các bạn đã theo dõi bài viết của mình. Chúc các bạn thành công. Hẹn gặp lại các bạn ở những chủ đề tiếp theo.
Nguồn tham khảo:
https://howkteam.vn/course/lap-trinh-java-co-ban-den-huong-doi-tuong/mang-trong-java-3849
https://tek4.vn/khoa-hoc/lap-trinh-huong-doi-tuong-voi-java/gioi-thieu-mang
https://tek4.vn/khoa-hoc/lap-trinh-huong-doi-tuong-voi-java/kich-thuoc-cua-mang
https://tek4.vn/khoa-hoc/lap-trinh-huong-doi-tuong-voi-java/thay-doi-phan-tu-mang