Array Là Gì? Khái Niệm, Cách Dùng Và Ví Dụ Dễ Hiểu

Khi mới bắt đầu, có rất nhiều khái niệm cơ bản mà chúng ta cần làm quen. Một trong số đó, vô cùng quan trọng và được sử dụng rộng rãi, chính là Array (hay còn gọi là mảng).

Hiểu rõ về array sẽ mở ra cánh cửa để bạn tiếp cận và làm việc với dữ liệu hiệu quả hơn rất nhiều. Bài viết này được thiết kế dành riêng cho người mới, giúp bạn nắm vững từ khái niệm đến cách sử dụng array qua các ví dụ thực tế. Chúng ta cùng bắt đầu nhé!

Array là gì?

Array (mảng) là một cấu trúc dữ liệu cơ bản trong lập trình, được dùng để lưu trữ một tập hợp các phần tửcùng kiểu dữ liệu (ví dụ: chỉ toàn số nguyên, hoặc chỉ toàn chuỗi văn bản). Các phần tử này được đặt liền kề nhau trong bộ nhớ máy tính.

Array giúp bạn tổ chức và quản lý một nhóm dữ liệu liên quan đến nhau dưới một tên biến duy nhất. Điều này làm cho việc xử lý dữ liệu hàng loạt trở nên đơn giản và thuận tiện hơn rất nhiều.

Hãy hình dung array như một dãy các “ngăn kéo” được đánh số thứ tự liên tiếp, bắt đầu từ số 0. Mỗi ngăn kéo này chính là nơi chứa một phần tử dữ liệu riêng biệt của array.

Ví dụ, nếu bạn có một danh sách 10 số nguyên cần lưu trữ, thay vì tạo 10 biến riêng lẻ, bạn chỉ cần khai báo một array gồm 10 phần tử kiểu số nguyên.

Kích thước của array, tức là số lượng phần tử mà nó có thể chứa, thường được xác định ngay khi bạn tạo ra (khai báo) array đó. Kích thước này có thể cố định và không thay đổi sau khi được tạo, tùy thuộc vào ngôn ngữ lập trình.

Việc sử dụng array là nền tảng cho nhiều cấu trúc dữ liệu phức tạp hơn và là kỹ năng bắt buộc đối với bất kỳ lập trình viên nào, dù là người mới bắt đầu hay đã có kinh nghiệm.

Mảng (Array) Hoạt Động Như Thế Nào?

Để hiểu rõ hơn về array, chúng ta cần đi sâu vào cách nó được tổ chức và hoạt động bên trong máy tính. Cơ chế hoạt động của array khá đơn giản nhưng lại mang lại hiệu quả cao trong việc truy xuất dữ liệu.

Cấu trúc bộ nhớ của Array: Dữ liệu liền kề

Điểm đặc trưng quan trọng nhất của array là các phần tử của nó được lưu trữ tại các vị trí bộ nhớ liền kề nhau. Điều này có nghĩa là các phần tử được đặt sát nhau theo một trình tự nhất định trong bộ nhớ RAM của máy tính.

Ví dụ, nếu bạn có một array gồm 5 số nguyên, hệ thống sẽ tìm một vùng bộ nhớ đủ lớn để chứa cả 5 số đó và cấp phát liền kề cho array. Phần tử đầu tiên nằm ở địa chỉ bộ nhớ A, phần tử thứ hai sẽ nằm ngay sau đó ở địa chỉ A + kích thước_của_một_số_nguyên, và cứ thế tiếp tục.

Cấu trúc bộ nhớ liền kề này mang lại một lợi ích cực lớn: khả năng truy cập trực tiếp (direct access) hoặc truy cập ngẫu nhiên (random access) đến bất kỳ phần tử nào trong array.

Bạn không cần phải đi tuần tự từ đầu mảng để tìm đến phần tử mong muốn. Thay vào đó, chỉ cần biết địa chỉ bộ nhớ bắt đầu của array và chỉ mục của phần tử, hệ thống có thể tính toán ngay ra địa chỉ chính xác của phần tử đó.

Vai trò của Chỉ mục (Index) trong Array và Tại sao bắt đầu từ 0

Như đã đề cập, mỗi phần tử trong array có một vị trí duy nhất được xác định bởi chỉ mục (index) của nó. Chỉ mục giống như “số nhà” của từng phần tử trong dãy bộ nhớ liền kề đó.

Quan trọng là, trong hầu hết các ngôn ngữ lập trình phổ biến hiện nay như C++, Java, Python, JavaScript, C#, chỉ mục của array luôn bắt đầu từ số 0. Phần tử đầu tiên có chỉ mục là 0, phần tử thứ hai có chỉ mục là 1, và cứ thế tăng dần.

Ví dụ, một array có 5 phần tử sẽ có các chỉ mục lần lượt là 0, 1, 2, 3, 4. Chỉ mục của phần tử cuối cùng sẽ luôn là kích thước của array trừ đi 1.

Việc chỉ mục bắt đầu từ 0 có nguồn gốc từ cách máy tính tính toán địa chỉ bộ nhớ. Địa chỉ của phần tử thứ i được tính bằng Địa chỉ_bắt_đầu_của_array + i * Kích_thước_của_một_phần_tử. Nếu chỉ mục bắt đầu từ 1, công thức sẽ phức tạp hơn một chút (Địa chỉ_bắt_đầu + (i-1) * Kích_thước). Bắt đầu từ 0 giúp việc tính toán này trở nên đơn giản và hiệu quả hơn cho phần cứng máy tính.

Chỉ mục là yếu tố then chốt để tương tác với dữ liệu trong array. Bạn dùng chỉ mục để đọc giá trị của một phần tử, hoặc gán một giá trị mới cho nó.

Kích thước (Size) của Array

Kích thước của array là tổng số lượng phần tử mà array đó có thể chứa. Khi bạn khai báo một array, bạn thường cần chỉ định kích thước của nó.

Trong nhiều ngôn ngữ lập trình cấp thấp hoặc truyền thống như C hay C++, kích thước của array là cố định ngay sau khi nó được tạo. Bạn không thể thay đổi kích thước này trong quá trình chạy chương trình. Nếu cần nhiều hoặc ít chỗ hơn, bạn sẽ phải tạo một array mới và sao chép dữ liệu sang.

Tuy nhiên, trong các ngôn ngữ hiện đại hơn hoặc với các cấu trúc dữ liệu “giống array” (như List trong Python/C#, ArrayList trong Java), kích thước có thể linh hoạt thay đổi (dynamic size). Mặc dù vậy, khái niệm array “truyền thống” với kích thước cố định vẫn là nền tảng quan trọng cần nắm vững.

Việc biết kích thước của array rất quan trọng khi làm việc với nó. Nó giúp bạn xác định phạm vi chỉ mục hợp lệ (từ 0 đến kích thước - 1) và tránh các lỗi truy cập ngoài phạm vi (index out of bounds error), một lỗi rất phổ biến khi mới học lập trình.

Các Loại Array Phổ Biến

Array không chỉ tồn tại dưới một dạng duy nhất. Chúng ta có thể phân loại array dựa trên số lượng “chiều” mà nó có. Các loại phổ biến nhất là mảng một chiều và mảng hai chiều.

Mảng Một Chiều (One-Dimensional Array): Giới thiệu & Cấu trúc

Mảng một chiều là dạng array đơn giản và cơ bản nhất. Nó là một chuỗi tuyến tính (liên tiếp) các phần tử. Hãy quay lại ví dụ “dãy ngăn kéo” - đó chính là hình ảnh của mảng một chiều.

Trong mảng một chiều, mỗi phần tử được xác định chỉ bằng một chỉ mục duy nhất. Ví dụ: array[0], array[1], array[2],…

Bạn thường sử dụng mảng một chiều để lưu trữ các danh sách đơn giản, ví dụ như:

  • Danh sách tên học sinh
  • Danh sách các ngày trong tuần
  • Tập hợp các giá trị nhiệt độ đo được

Cấu trúc bộ nhớ của mảng một chiều là các phần tử được sắp xếp liền kề nhau theo một hàng duy nhất. Việc truy cập phần tử rất nhanh vì chỉ cần tính toán địa chỉ dựa trên chỉ mục duy nhất đó.

Ví dụ cấu trúc mảng một chiều (tưởng tượng trong bộ nhớ):

[ Phần tử 0 ] [ Phần tử 1 ] [ Phần tử 2 ] [ Phần tử 3 ] [ Phần tử 4 ] ...
(Chỉ mục 0)   (Chỉ mục 1)   (Chỉ mục 2)   (Chỉ mục 3)   (Chỉ mục 4)   ...

Mảng Hai Chiều (Two-Dimensional Array): Giới thiệu & Cấu trúc

Mảng hai chiều phức tạp hơn một chút. Thay vì chỉ có một “dãy ngăn kéo” duy nhất, mảng hai chiều có thể được hình dung như một “bảng” hoặc một “ma trận”, bao gồm các hàng (rows) và các cột (columns).

Mỗi phần tử trong mảng hai chiều được xác định bởi hai chỉ mục: một chỉ mục cho hàng và một chỉ mục cho cột. Ví dụ: array[chỉ_mục_hàng][chỉ_mục_cột]. Cả hai chỉ mục này cũng thường bắt đầu từ 0.

Bạn thường sử dụng mảng hai chiều để biểu diễn các dữ liệu có cấu trúc dạng lưới, ví dụ như:

  • Bảng tính (spreadsheet)
  • Ma trận trong toán học
  • Bản đồ trò chơi (grid)
  • Hình ảnh (ma trận pixel)

Mặc dù được hình dung như một bảng hai chiều, trong bộ nhớ máy tính, mảng hai chiều vẫn thường được lưu trữ dưới dạng một khối bộ nhớ một chiều lớn, theo thứ tự từng hàng hoặc từng cột (row-major order hoặc column-major order). Tuy nhiên, cách bạn truy cập nó trong code là thông qua hai chỉ mục.

Ví dụ cấu trúc mảng hai chiều (tưởng tượng như bảng):

          Cột 0     Cột 1     Cột 2
Hàng 0: [ (0,0) ] [ (0,1) ] [ (0,2) ]
Hàng 1: [ (1,0) ] [ (1,1) ] [ (1,2) ]
Hàng 2: [ (2,0) ] [ (2,1) ] [ (2,2) ]

(Các cặp số là chỉ mục [hàng][cột])

Mảng Đa Chiều (Giới thiệu ngắn gọn)

Ngoài mảng một chiều và hai chiều, một số ngôn ngữ lập trình còn hỗ trợ mảng đa chiều với ba chiều trở lên (ví dụ: mảng ba chiều cho dữ liệu không gian 3D).

Mảng đa chiều sử dụng nhiều chỉ mục để xác định vị trí phần tử (ví dụ: array[chỉ_mục_1][chỉ_mục_2][chỉ_mục_3]...). Mặc dù cấu trúc có vẻ phức tạp, nguyên lý lưu trữ trong bộ nhớ và truy cập vẫn dựa trên việc tính toán địa chỉ từ các chỉ mục và địa chỉ gốc của mảng.

Tuy nhiên, trong thực tế lập trình, mảng ba chiều trở lên ít phổ biến hơn mảng một và hai chiều, và thường có thể được thay thế bằng các cấu trúc dữ liệu hoặc cách tiếp cận khác phức tạp hơn. Với người mới bắt đầu, việc nắm vững mảng một và hai chiều là ưu tiên hàng đầu.

Tại Sao Cần Sử Dụng Array? Ưu Điểm Của Mảng

Sau khi hiểu array là gì và cách nó hoạt động, câu hỏi đặt ra là tại sao chúng ta lại cần sử dụng array? Array mang lại nhiều ưu điểm nổi bật, đặc biệt khi làm việc với các tập dữ liệu có cấu trúc.

Truy cập dữ liệu cực nhanh nhờ chỉ mục

Ưu điểm lớn nhất của array là khả năng truy cập trực tiếp đến bất kỳ phần tử nào chỉ thông qua chỉ mục của nó. Độ phức tạp thời gian để truy cập một phần tử là O(1), nghĩa là thời gian truy cập là không đổi, không phụ thuộc vào kích thước của array.

Điều này có được là nhờ cấu trúc bộ nhớ liền kề. Máy tính chỉ cần biết địa chỉ bắt đầu của mảng và chỉ mục, từ đó tính toán ngay địa chỉ chính xác của phần tử mà không cần phải “duyệt” qua các phần tử trước đó.

Ví dụ, truy cập phần tử ở chỉ mục 0 hay chỉ mục 1000 trong một array đều mất khoảng thời gian như nhau. Điều này làm cho array rất hiệu quả cho các tác vụ cần truy xuất dữ liệu nhanh chóng và thường xuyên dựa trên vị trí.

Tổ chức dữ liệu cùng loại hiệu quả và gọn gàng

Array cho phép bạn lưu trữ một bộ sưu tập lớn các mục dữ liệu cùng loại dưới một tên biến duy nhất. Thay vì phải quản lý hàng chục, hàng trăm biến riêng lẻ (ví dụ: diem1, diem2, diem3,…), bạn chỉ cần một array duy nhất (ví dụ: danhSachDiem).

Điều này giúp mã nguồn của bạn trở nên gọn gàng, dễ đọc và dễ quản lý hơn rất nhiều. Việc thêm, xóa (trên lý thuyết với mảng cố định), hoặc truy cập các phần tử trở nên có hệ thống.

Khi bạn cần xử lý toàn bộ tập dữ liệu đó (ví dụ: tính tổng điểm, tìm điểm cao nhất), việc sử dụng array kết hợp với các cấu trúc lặp (vòng lặp for, while) trở nên cực kỳ hiệu quả.

Hỗ trợ nhiều thao tác xử lý dữ liệu theo nhóm

Array là nền tảng cho nhiều thuật toán và thao tác xử lý dữ liệu theo nhóm. Bạn có thể dễ dàng thực hiện các tác vụ như:

  • Tìm kiếm một giá trị trong array
  • Sắp xếp các phần tử trong array theo thứ tự tăng hoặc giảm dần
  • Tính tổng, trung bình cộng, giá trị lớn nhất/nhỏ nhất của các phần tử số
  • Sao chép, gộp hoặc cắt nhỏ array

Việc các phần tử được sắp xếp có trật tự và có thể truy cập bằng chỉ mục làm cho việc triển khai các thuật toán trên array trở nên thuận tiện và hiệu quả.

Các Thao Tác Cơ Bản Với Array Ai Cũng Cần Biết

Khi làm việc với array, có một số thao tác cơ bản mà bạn sẽ thực hiện thường xuyên. Nắm vững các thao tác này là bước đệm quan trọng để bạn sử dụng array hiệu quả trong các chương trình của mình.

Khai báo và Khởi tạo Array

Khai báo array là việc bạn thông báo cho trình biên dịch hoặc trình thông dịch biết rằng bạn muốn sử dụng một biến kiểu array, đồng thời xác định kiểu dữ liệu của các phần tử mà array đó sẽ chứa và (thường là) kích thước của nó.

Cú pháp khai báo có thể khác nhau giữa các ngôn ngữ.

Khởi tạo array là việc bạn gán các giá trị ban đầu cho các phần tử của array sau khi nó được khai báo. Nếu không khởi tạo tường minh, các phần tử có thể sẽ chứa các giá trị mặc định (ví dụ: 0 cho số, null cho đối tượng, false cho boolean) hoặc các giá trị rác tùy thuộc vào ngôn ngữ và vị trí khai báo (trong/ngoài hàm).

Bạn có thể khởi tạo array ngay lúc khai báo hoặc sau đó.

Java

// Ví dụ Khai báo và Khởi tạo Array trong Java
// Khai báo array 'diemSinhVien' kiểu số nguyên, kích thước 5
int[] diemSinhVien = new int[5];

// Khởi tạo giá trị cho các phần tử sau khi khai báo
diemSinhVien[0] = 9;
diemSinhVien[1] = 7;
// ...

// Khai báo và khởi tạo array ngay lập tức
String[] tenHocSinh = {"An", "Binh", "Hoa"};
// Kích thước array 'tenHocSinh' sẽ là 3

Python

# Ví dụ Khai báo và Khởi tạo "Array" (List) trong Python
# Python List hoạt động giống array động
diem_sinh_vien = [0] * 5 # Tạo list 5 phần tử, tất cả đều là 0

# Khởi tạo giá trị
diem_sinh_vien[0] = 90
diem_sinh_vien[1] = 75

# Khai báo và khởi tạo ngay
ten_hoc_sinh = ["An", "Binh", "Hoa"]

Truy cập và Thay đổi Phần tử

Để đọc giá trị của một phần tử trong array hoặc thay đổi giá trị của nó, bạn sử dụng tên array kèm theo chỉ mục của phần tử đó đặt trong dấu ngoặc vuông [].

Cú pháp chung thường là ten_array[chi_muc].

Khi truy cập, bạn sẽ nhận được giá trị đang được lưu tại vị trí chỉ mục đó. Khi thay đổi, bạn gán một giá trị mới vào vị trí chỉ mục đó.

Điều quan trọng là phải đảm bảo chỉ mục bạn sử dụng nằm trong phạm vi hợp lệ của array (từ 0 đến kích thước - 1). Truy cập chỉ mục âm hoặc chỉ mục lớn hơn hoặc bằng kích thước sẽ gây ra lỗi.

Java

// Ví dụ Truy cập và Thay đổi Phần tử trong Java (tiếp theo ví dụ trên)
System.out.println(diemSinhVien[0]); // Truy cập phần tử đầu tiên (in ra 9)

diemSinhVien[0] = 10; // Thay đổi giá trị phần tử đầu tiên thành 10

System.out.println(diemSinhVien[0]); // Truy cập lại (in ra 10)

// Ví dụ Truy cập phần tử trong array String
System.out.println(tenHocSinh[1]); // In ra "Binh"
tenHocSinh[2] = "Lan"; // Thay đổi phần tử cuối cùng

Python

# Ví dụ Truy cập và Thay đổi Phần tử trong Python (tiếp theo ví dụ trên)
print(diem_sinh_vien[0]) # In ra 90

diem_sinh_vien[0] = 100 # Thay đổi giá trị phần tử đầu tiên

print(diem_sinh_vien[0]) # In ra 100

print(ten_hoc_sinh[1]) # In ra "Binh"
ten_hoc_sinh[2] = "Lan" # Thay đổi phần tử cuối cùng

Duyệt (Loop) qua các Phần tử trong Array

Duyệt array là quá trình truy cập tuần tự từng phần tử của array từ đầu đến cuối (hoặc ngược lại) để thực hiện một thao tác nào đó trên mỗi phần tử.

Đây là một thao tác rất phổ biến khi bạn cần xử lý toàn bộ dữ liệu trong array, ví dụ như in tất cả phần tử, tính tổng, tìm kiếm giá trị…

Các cấu trúc lặp như vòng lặp for, while thường được sử dụng để duyệt array. Cách phổ biến nhất là sử dụng vòng lặp for kết hợp với chỉ mục.

Java

// Ví dụ Duyệt Array bằng vòng lặp for trong Java
int[] soNguyen = {10, 20, 30, 40, 50};

for (int i = 0; i < soNguyen.length; i++) {
    System.out.println("Phần tử tại chỉ mục " + i + " là: " + soNguyen[i]);
}

// Ví dụ Duyệt Array bằng for-each (cải tiến) trong Java
for (int so : soNguyen) {
    System.out.println("Giá trị phần tử là: " + so);
}

Python

# Ví dụ Duyệt List (Array) bằng vòng lặp for trong Python
so_nguyen = [10, 20, 30, 40, 50]

# Duyệt bằng chỉ mục
for i in range(len(so_nguyen)):
    print(f"Phần tử tại chỉ mục {i} là: {so_nguyen[i]}")

# Duyệt trực tiếp qua các phần tử (phổ biến hơn trong Python)
for so in so_nguyen:
    print(f"Giá trị phần tử là: {so}")

Việc lựa chọn cách duyệt phụ thuộc vào mục đích của bạn. Nếu bạn cần biết chỉ mục của phần tử, dùng vòng lặp for với chỉ mục. Nếu chỉ cần giá trị của các phần tử, dùng vòng lặp for-each (hoặc tương đương trong ngôn ngữ đó) sẽ đơn giản hơn.

Sau khi đã nắm vững Array là gì và thực hiện các thao tác cơ bản để xử lý dữ liệu, bước tiếp theo có thể là áp dụng kiến thức này vào việc xây dựng và triển khai các ứng dụng thực tế trên môi trường internet. Để mã lệnh của bạn có thể chạy và phục vụ người dùng, bạn sẽ cần một nơi để lưu trữ (hosting) và một máy chủ hoạt động liên tục.

Tại InterData, bạn có thể tìm thấy nền tảng hạ tầng phù hợp. Khởi đầu với dịch vụ Web Hosting giá rẻ chất lượng uy tín trên hệ thống ổn định. Nếu ứng dụng đòi hỏi tài nguyên riêng mạnh mẽ hơn, dịch vụ VPS Hosting giá rẻ uy tín tốc độ cao sử dụng phần cứng chuyên dụng thế hệ mới có thể đáp ứng. Hay khi cần giải pháp linh hoạt với cấu hình cao, dịch vụ Cloud Server chất lượng giá rẻ cấu hình cao ứng dụng công nghệ ảo hóa tiên tiến, mang lại hiệu năng tốc độ cao.

Array Trong Các Ngôn Ngữ Lập Trình Phổ Biến (Cú pháp & Ví dụ)

Khái niệm array là chung, nhưng cách khai báo, khởi tạo và thao tác có thể hơi khác nhau tùy thuộc vào ngôn ngữ lập trình bạn đang sử dụng. Dưới đây là cái nhìn tổng quan về array trong một số ngôn ngữ phổ biến nhất.

Array trong C++

Trong C++, array là một mảng có kích thước cố định. Kiểu dữ liệu của tất cả phần tử phải giống nhau.

C++

// Ví dụ Khai báo và Khởi tạo Array trong C++
#include <iostream>

int main() {
    // Khai báo array 'diem' kiểu int, kích thước 5
    int diem[5];

    // Khởi tạo giá trị
    diem[0] = 90;
    diem[1] = 75;
    diem[2] = 88;
    diem[3] = 92;
    diem[4] = 80;

    // Khai báo và khởi tạo ngay
    std::string ten[3] = {"An", "Binh", "Hoa"};

    // Truy cập và In phần tử
    std::cout << "Diem cua sinh vien thu nhat: " << diem[0] << std::endl; // In ra 90
    std::cout << "Ten cua hoc sinh thu ba: " << ten[2] << std::endl; // In ra Hoa

    // Duyệt array bằng vòng lặp for
    std::cout << "Danh sach diem:" << std::endl;
    for (int i = 0; i < 5; ++i) {
        std::cout << diem[i] << " ";
    }
    std::cout << std::endl;

    return 0;
}

C++ cũng có cấu trúc std::vector trong thư viện chuẩn, hoạt động giống array nhưng có kích thước linh hoạt, thường được sử dụng thay cho array truyền thống trong nhiều trường hợp.

Array trong Java

Trong Java, array cũng có kích thước cố định và là một đối tượng.

Java

// Ví dụ Khai báo và Khởi tạo Array trong Java
public class ArrayDemo {
    public static void main(String[] args) {
        // Khai báo array 'nhietDo' kiểu double, kích thước 7
        double[] nhietDo = new double[7];

        // Khởi tạo giá trị
        nhietDo[0] = 25.5;
        nhietDo[1] = 26.0;
        nhietDo[2] = 24.8;
        // ... gán giá trị cho các chỉ mục còn lại

        // Khai báo và khởi tạo ngay
        String[] ngayTrongTuan = {"Thu Hai", "Thu Ba", "Thu Tu", "Thu Nam", "Thu Sau", "Thu Bay", "Chu Nhat"};

        // Truy cập và In phần tử
        System.out.println("Nhiet do ngay dau tuan: " + nhietDo[0]); // In ra 25.5
        System.out.println("Hom nay la: " + ngayTrongTuan[3]); // In ra Thu Nam

        // Duyệt array bằng vòng lặp for
        System.out.println("Danh sach ngay trong tuan:");
        for (int i = 0; i < ngayTrongTuan.length; i++) {
            System.out.println(ngayTrongTuan[i]);
        }

        // Duyệt array bằng for-each
        System.out.println("Danh sach nhiet do:");
        for (double temp : nhietDo) {
            System.out.println(temp);
        }
    }
}

Java cung cấp ArrayList trong Collections Framework, là một lớp triển khai danh sách động, rất phổ biến và thường được dùng khi cần một cấu trúc linh hoạt hơn array cố định.

Array trong Python

Trong Python, cấu trúc dữ liệu built-in (có sẵn) phổ biến nhất và thường được sử dụng thay cho array truyền thống là List. List trong Python có nhiều đặc điểm giống array (có chỉ mục, có thứ tự) nhưng linh hoạt hơn (kích thước động, có thể chứa các kiểu dữ liệu khác nhau - mặc dù thường dùng để chứa cùng kiểu). Python cũng có module array cho các mảng hiệu quả hơn về bộ nhớ khi làm việc với số lượng lớn các kiểu dữ liệu số đồng nhất.

Python

# Ví dụ sử dụng List (thường dùng thay array) trong Python
# Khai báo và khởi tạo List
diem_so = [85, 90, 78, 95, 88]

# List có thể chứa các kiểu dữ liệu khác nhau, nhưng tốt nhất nên dùng cùng loại nếu muốn giống array
thong_tin = ["Nguyen Van A", 20, 8.5, True]

# Truy cập và In phần tử
print(diem_so[0]) # In ra 85
print(thong_tin[1]) # In ra 20

# Thay đổi phần tử
diem_so[2] = 80
print(diem_so) # In ra [85, 90, 80, 95, 88]

# Duyệt List bằng vòng lặp for
print("Danh sach diem:")
for diem in diem_so:
    print(diem)

# Duyệt bằng chỉ mục và range()
print("Danh sach thong tin voi chi muc:")
for i in range(len(thong_tin)):
    print(f"Phan tu tai chi muc {i} la: {thong_tin[i]}")

Khi làm việc với các mảng số lớn và cần hiệu năng cao hoặc tiết kiệm bộ nhớ, module array của Python có thể được sử dụng, nhưng List vẫn là lựa chọn phổ biến cho các nhu cầu chung.

Array trong JavaScript (JS)

Trong JavaScript, array về mặt kỹ thuật là một loại đối tượng đặc biệt, có thể chứa các phần tử thuộc nhiều kiểu dữ liệu khác nhau và có kích thước linh hoạt. Tuy nhiên, chúng hoạt động rất giống mảng trong các ngôn ngữ khác và được sử dụng rộng rãi.

JavaScript

// Ví dụ Khai báo và Khởi tạo Array trong JavaScript
// Khai báo array rong
let danhSachSanPham = [];

// Khai báo và khởi tạo voi gia tri ban dau
let giaSanPham = [10000, 25000, 15000, 30000];

// Array co the chua cac kieu du lieu khac nhau
let thongTinNguoiDung = ["Tran Thi B", 25, true, { thanhPho: "Hanoi" }];

// Truy cap va In phan tu
console.log(giaSanPham[0]); // In ra 10000
console.log(thongTinNguoiDung[2]); // In ra true

// Thay doi phan tu
giaSanPham[1] = 20000;
console.log(giaSanPham); // In ra [10000, 20000, 15000, 30000]

// Duyet array bang vong lap for
console.log("Danh sach gia san pham:");
for (let i = 0; i < giaSanPham.length; i++) {
    console.log(giaSanPham[i]);
}

// Duyet array bang forEach (phuong thuc cua array)
console.log("Danh sach thong tin nguoi dung:");
thongTinNguoiDung.forEach(function(phanTu, chiMuc) {
    console.log("Phan tu tai chi muc " + chiMuc + " la: " + phanTu);
});

// Duyet array bang for...of (cho gia tri)
console.log("Gia tri san pham su dung for...of:");
for (let gia of giaSanPham) {
    console.log(gia);
}

JavaScript cung cấp rất nhiều phương thức tích hợp sẵn để làm việc với array (như push, pop, map, filter, reduce), làm cho việc thao tác với mảng trở nên rất mạnh mẽ và tiện lợi.

Array trong C#

Trong C#, array là một tập hợp các phần tử có kiểu dữ liệu giống nhau và có kích thước cố định.

C#

// Ví dụ Khai báo và Khởi tạo Array trong C#
using System;

public class ArrayDemo
{
    public static void Main(string[] args)
    {
        // Khai báo array 'maSoSanPham' kiểu string, kích thước 4
        string[] maSoSanPham = new string[4];

        // Khởi tạo giá trị
        maSoSanPham[0] = "SP001";
        maSoSanPham[1] = "SP005";
        maSoSanPham[2] = "SP003";
        maSoSanPham[3] = "SP008";

        // Khai báo và khởi tạo ngay
        int[] soLuongTon = { 150, 220, 180, 300 };

        // Truy cập và In phần tử
        Console.WriteLine("Ma san pham dau tien: " + maSoSanPham[0]); // In ra SP001
        Console.WriteLine("So luong ton cua san pham thu ba: " + soLuongTon[2]); // In ra 180

        // Duyệt array bằng vòng lặp for
        Console.WriteLine("Danh sach ma san pham:");
        for (int i = 0; i < maSoSanPham.Length; i++)
        {
            Console.WriteLine(maSoSanPham[i]);
        }

        // Duyệt array bằng foreach
        Console.WriteLine("Danh sach so luong ton:");
        foreach (int soLuong in soLuongTon)
        {
            Console.WriteLine(soLuong);
        }
    }
}

Giống như Java, C# có lớp List<T> trong namespace System.Collections.Generic cung cấp chức năng tương tự array nhưng với kích thước linh hoạt, và thường được ưa chuộng hơn khi cần thay đổi kích thước mảng trong lúc chạy.

Array trong PHP

Trong PHP, array rất linh hoạt. Một array PHP có thể hoạt động như một mảng số nguyên (numeric array) với chỉ mục bắt đầu từ 0, hoặc như một mảng kết hợp (associative array) sử dụng chuỗi làm khóa (key) thay vì chỉ mục số. Nó cũng có kích thước động.

PHP

<?php
// Ví dụ Khai báo và Khởi tạo Array trong PHP

// Khai báo array so nguyen (numeric array)
$diem_thi = array(85, 92, 78, 95);
// Hoặc cú pháp ngắn gọn (tu PHP 5.4 tro len)
$mon_hoc = ["Toan", "Ly", "Hoa", "Sinh"];

// Khai bao array ket hop (associative array)
$thong_tin_sv = array(
    "ma_sv" => "SV001",
    "ten" => "Le Van C",
    "diem_trung_binh" => 8.8
);
// Hoac cu phap ngan gon
$thong_tin_san_pham = [
    "ma_sp" => "SP010",
    "ten_sp" => "Dien Thoai",
    "gia" => 15000000
];

// Truy cap va In phan tu
echo "Diem thi mon dau tien: " . $diem_thi[0] . "<br>"; // In ra 85
echo "Ten mon hoc thu ba: " . $mon_hoc[2] . "<br>"; // In ra Hoa
echo "Ma sinh vien: " . $thong_tin_sv["ma_sv"] . "<br>"; // In ra SV001
echo "Gia san pham: " . $thong_tin_san_pham["gia"] . "<br>"; // In ra 15000000

// Thay doi phan tu
$diem_thi[1] = 95;
$thong_tin_sv["ten"] = "Tran Van D";

// Duyet array so nguyen bang vong lap for
echo "Danh sach diem thi:<br>";
for ($i = 0; $i < count($diem_thi); $i++) {
    echo $diem_thi[$i] . "<br>";
}

// Duyet array bang foreach
echo "Thong tin sinh vien:<br>";
foreach ($thong_tin_sv as $key => $value) {
    echo $key . ": " . $value . "<br>";
}
?>

Tính linh hoạt của array trong PHP làm cho nó trở thành một cấu trúc dữ liệu rất mạnh mẽ, có thể được sử dụng cho nhiều mục đích khác nhau.

So Sánh Array Với Các Cấu Trúc Dữ Liệu Tương Tự

Trong quá trình học lập trình, bạn sẽ gặp các cấu trúc dữ liệu khác có vẻ ngoài hoặc chức năng tương tự như array, ví dụ như List (Danh sách) hay Vector. Việc hiểu sự khác biệt giữa chúng rất quan trọng.

Array và List: Sự khác biệt cốt lõi

Điểm khác biệt quan trọng nhất giữa array “truyền thống” và List (như List trong Python hoặc List<T> trong C#) là kích thước.

  • Array (Cố định): Kích thước được xác định khi tạo và không thể thay đổi sau đó. Việc thêm hoặc bớt phần tử đòi hỏi tạo array mới.
  • List (Linh hoạt/Động): Kích thước có thể tự động mở rộng hoặc thu hẹp khi bạn thêm hoặc bớt phần tử. Bạn không cần lo lắng về việc quản lý bộ nhớ thủ công như array cố định.

Về hiệu năng:

  • Array: Truy cập phần tử theo chỉ mục (ngẫu nhiên) là O(1) (rất nhanh). Thêm/xóa phần tử ở giữa mảng cố định thường tốn kém (O(n)) vì phải dịch chuyển các phần tử còn lại.
  • List: Truy cập phần tử theo chỉ mục cũng thường là O(1) (đối với các triển khai dựa trên mảng như ArrayList). Tuy nhiên, việc thêm hoặc xóa phần tử (đặc biệt ở giữa) có thể tốn kém hơn O(1) (ví dụ: O(n) nếu phải dịch chuyển nhiều phần tử khi mảng nội bộ cần thay đổi kích thước).

Array và ArrayList (trong Java)

Trong Java, Array là cấu trúc có kích thước cố định như đã mô tả. ArrayList là một lớp trong Collections Framework, triển khai giao diện List, và được xây dựng dựa trên một mảng bên trong (internal array).

Điểm khác biệt chính là:

  • Array: Kích thước cố định, làm việc trực tiếp với kiểu dữ liệu nguyên thủy hoặc đối tượng.
  • ArrayList: Kích thước động, tự động thay đổi khi thêm/bớt phần tử. Luôn làm việc với đối tượng (không dùng được trực tiếp với kiểu nguyên thủy như int, cần dùng Wrapper Class như Integer). Cung cấp nhiều phương thức tiện lợi cho việc thêm, xóa, tìm kiếm.

Về hiệu năng, ArrayList cũng có truy cập ngẫu nhiên O(1). Tuy nhiên, khi ArrayList cần mở rộng kích thước, nó sẽ tạo một mảng mới lớn hơn và sao chép tất cả phần tử cũ sang, quá trình này tốn kém hơn so với array cố định.

Ưu nhược điểm khi so sánh

  • Chọn Array khi: Bạn biết chính xác số lượng phần tử mình cần lưu trữ ngay từ đầu, và kích thước đó không thay đổi. Array thường hiệu quả hơn về bộ nhớ và hiệu năng truy cập trực tiếp so với các cấu trúc động khi kích thước cố định.
  • Chọn List/ArrayList khi: Bạn không biết trước số lượng phần tử, hoặc số lượng này thay đổi thường xuyên. List/ArrayList mang lại sự linh hoạt và tiện lợi trong thao tác thêm/xóa, đánh đổi bằng một chút chi phí hiệu năng và bộ nhớ so với array cố định trong một số trường hợp.

Khi Nào Nên Sử Dụng Array?

Array là lựa chọn phù hợp trong nhiều tình huống thực tế khi lập trình. Dưới đây là một số ví dụ điển hình về thời điểm bạn nên cân nhắc sử dụng array:

  • Lưu trữ một bộ sưu tập dữ liệu cùng loại với số lượng cố định: Ví dụ: danh sách các tháng trong năm (12), số ngày trong tuần (7), bảng điểm của một lớp học có sĩ số xác định, ma trận kích thước cố định trong các bài toán xử lý ảnh hoặc toán học.
  • Khi cần truy cập dữ liệu nhanh chóng và trực tiếp theo vị trí: Các ứng dụng cần đọc dữ liệu ở các chỉ mục cụ thể thường xuyên (ví dụ: truy cập pixel trong ảnh, tra cứu giá trị trong bảng theo chỉ số hàng/cột).
  • Khi làm việc với các thuật toán yêu cầu cấu trúc dữ liệu liền kề: Một số thuật toán sắp xếp (như Bubble Sort, Selection Sort) hoặc tìm kiếm (Binary Search - yêu cầu mảng đã sắp xếp) hoạt động hiệu quả nhất hoặc chỉ áp dụng được trên array.
  • Khi tài nguyên bộ nhớ là yếu tố quan trọng: Array truyền thống thường tiêu thụ ít bộ nhớ hơn so với các cấu trúc động có cùng số lượng phần tử, do không cần lưu trữ thêm thông tin quản lý kích thước động hoặc con trỏ phức tạp.

Việc lựa chọn giữa array và các cấu trúc dữ liệu khác như List, Linked List, Hash Map… phụ thuộc vào yêu cầu cụ thể của bài toán (tần suất thêm/xóa, tần suất truy cập theo chỉ mục, có biết trước kích thước không, v.v.). Tuy nhiên, array vẫn là một khối xây dựng cơ bản và quan trọng.

Nguồn biên tập: Array là gì? Định nghĩa, Ví dụ & Đặc điểm cơ bản của Mảng - InterData