1. Mảng trong bộ nhớ

Trong các ví dụ trước, hình minh họa có một chút không chính xác.

Khi tạo mảng (như khi tạo chuỗi), hai khối bộ nhớ riêng biệt được phân bổ: một khối để lưu chính mảng (vùng chứa) và khối thứ hai dành cho biến lưu địa chỉ của nó . Hình ảnh dưới đây thể hiện sự làm rõ này:

Mảng trong bộ nhớ

Bộ nhớ được phân bổ cho mảng các 10 intphần tử và int[]biến lưu trữ địa chỉ của intmảng, được hiển thị bằng màu xanh lá cây.

Để so sánh, một intbiến thông thường lưu trữ giá trị 199được hiển thị bằng màu xanh lam.

Điều này gợi nhớ một chút về việc lưu trữ các chuỗi trong bộ nhớ, bạn có nghĩ vậy không?

Đúng vậy, dây. Và giống như khi bạn làm việc với các chuỗi, bạn có thể gán các biến mảng cho nhau:

Mã số Giải trình
int[] a = new int[10];
a[2] = 4;
a[7] = 9;
int[] b = a;

a[9] = b[2] + a[7];
Tạo một mảng 10 intcác phần tử.
Gán giá trị 4cho ô có chỉ mục 2.
Gán giá trị 9cho ô có chỉ mục 7.
Trong bbiến lưu địa chỉ lưu trong abiến.
Bây giờ abtrỏ đến cùng một đối tượng mảng trong bộ nhớ.
Trong ô của đối tượng mảng có chỉ số 9, viết tổng các giá trị được lưu trữ trong các ô 2(lưu trữ giá trị 4) và 7(lưu trữ giá trị 9).

Đối tượng mảng vẫn ở đúng vị trí của nó và các biến ablưu trữ cùng một địa chỉ (tham chiếu) cho cùng một đối tượng. Nhìn vào bức tranh:

Mảng trong bộ nhớ 2

2. Chi tiết hơn về cách làm việc với mảng

Bạn có thể tạo một mảng các phần tử thuộc bất kỳ loại nào. Để làm điều này, chỉ cần viết dấu ngoặc vuông sau tên loại. Nói chung, việc tạo một mảng trông như thế này:

type[] name = new type[number];

Trong đó kiểu là kiểu của các phần tử mà chúng ta sẽ lưu trữ trong mảng. Tên là tên của biến mà chúng ta sẽ sử dụng để chỉ mảng và số là số lượng ô trong mảng.

Ví dụ trên là dạng chuẩn để tạo một biến mảng và đối tượng mảng. Trong thực tế, đây là hai thực thể riêng biệt.

Bạn có thể tạo biến mảng riêng biệt với đối tượng mảng:

type[] name;
name = new type[number];

Và một điểm nữa không hề nhỏ:

Bạn có thể sử dụng các biến hoặc thậm chí toàn bộ biểu thức làm mảng chỉ sốsố phần tử mảng .

Ví dụ:

Mã số Giải trình
int n = 100;
int[] a = new int[n];
Tạo một mảng ncác phần tử
int n = 100;
int[] a = new int[n * 2 + 3];
Tạo một mảng với 203các phần tử
int n = 100;
int[] a = new int[n];
a[n-1] = 2;
a[n-2] = 3;
a[n/5] = a[n-1] + a[n-2]


// a[99] = 2;
// a[98] = 3;
// a[20] = a[99] + a[98];
Quan trọng:
Nhân tiện, bạn nên lưu ý rằng nếu bạn cố truy cập vào một ô của mảng bằng cách sử dụng một chỉ mục không tồn tại cho mảng đó (trong ví dụ của chúng tôi, điều đó có nghĩa là bất kỳ số nguyên nào không nằm trong phạm vi), thì chương trình sẽ gặp sự cố với 0..99một ArrayIndexOfBoundException, nghĩa là chỉ mục nằm ngoài giới hạn của mảng.

3. Độ dài mảng

Như bạn đã thấy trong ví dụ trước, bạn có thể tự tạo một biến mảng và sau đó gán một giá trị (tham chiếu đến một đối tượng mảng) cho nó ở đâu đó trong mã. Bạn thậm chí có thể làm điều này:

Mã số Giải trình
int[] array;
if (a < 10)
   array = new int[10];
else
   array = new int[20];
Tạo một biến mảng có kiểu int[]
Nếu abiến nhỏ hơn 10,
thì hãy tạo một mảng 10các phần tử.
Nếu không thì
tạo một mảng 20các phần tử

Và bây giờ bạn có thể làm gì khác với một mảng như vậy? Làm thế nào để bạn biết có bao nhiêu yếu tố trong đó?

Để giải quyết vấn đề này, các mảng có một thuộc tính (biến) đặc biệt có tên là length. Bạn có thể tìm độ dài của một mảng bằng cách sử dụng biểu thức này:

array.length;

Đây arraylà tên của biến mảng và lengthlà tên thuộc tính của mảng. Giá trị của lengththuộc tính không thể thay đổi: lengthbản thân thuộc tính có thể được gán cho các biến khác, nhưng không thể gán gì cho nó (nếu bạn cố làm điều này, chương trình sẽ không biên dịch được).

Chúng ta có thể tiếp tục với ví dụ trước như thế này:

Mã số Giải trình
int[] array;
if (a < 10)
   array = new int[10];
else
   array = new int[20];
for (int i = 0; i < array.length; i++)
{
   System.out.println(array[i]);
}
Tạo một biến mảng có kiểu int[]
Nếu abiến nhỏ hơn 10,
thì hãy tạo một mảng 10các phần tử.
Nếu không,
hãy tạo một mảng 20các phần tử
Lặp lại tất cả các phần tử của mảng: từ 0đến độ dàiarray.length - 1

4. Tổng hợp kiến ​​thức về mảng trong Java

Hãy tóm tắt lại những gì chúng ta biết về mảng:

Sự thật 1. Một mảng bao gồm nhiều ô.

Sự thật 2. Bạn truy cập một ô cụ thể bằng cách sử dụng số (chỉ mục) của nó.

Sự thật 3. Tất cả các ô đều cùng loại.

Sự thật 4. Giá trị ban đầu của tất cả các ô là 0 (nếu ô lưu trữ số), null(nếu ô lưu trữ tham chiếu đối tượng) hoặc false(nếu ô lưu trữ booleangiá trị). Bạn sẽ tìm hiểu thêm về các giá trị mặc định trong chương này .

Sự thật 5. String[] list chỉ là khai báo của một biến. Điều này không tự tạo vùng chứa (đối tượng mảng). Để sử dụng biến, trước tiên bạn cần tạo một mảng (vùng chứa) và gán nó cho biến. Xem ví dụ dưới đây.

Sự thật 6. Khi chúng ta tạo một đối tượng mảng (vùng chứa), chúng ta phải chỉ ra độ lớn của nó, tức là nó chứa bao nhiêu ô. Điều này được thực hiện với một tuyên bố như: new TypeName[n];

Sự thật 7. Độ dài của một mảng có thể được tìm thấy bằng cách sử dụng .lengththuộc tính.

Sự thật 8. Sau khi tạo một mảng, bạn không thể thay đổi loại phần tử của nó hoặc số lượng phần tử mà nó lưu trữ.

Mã số Giải trình
String s;
String[] list;
snull
list_null
list = new String[10];
int n = list.length;
Biến listlưu trữ một tham chiếu đến một đối tượng: một mảng chuỗi bao gồm 10các phần tử.
n10
list = new String[0];

Bây giờ listđề cập đến một mảng các 0phần tử. Mảng tồn tại, nhưng nó không thể lưu trữ bất kỳ phần tử nào.

list = null;
System.out.println(list[1]);
Một ngoại lệ (lỗi chương trình) sẽ được ném ra, tức là chương trình sẽ bị lỗi. listlưu trữ một tham chiếu đếnnull
list = new String[10];
System.out.println(list[10]);
Một ngoại lệ mảng ngoài giới hạn (lỗi chương trình) sẽ được tạo.
Nếu a listlưu trữ 10các phần tử/ô, thì các chỉ số hợp lệ là: 0 1 2 3 4 5 6 7 8 910phần tử.