Cho 2 mảng bằng nhau thì có lỗi k năm 2024

Mảng là một cấu trúc dữ liệu quan trọng trong lập trình Java, được sử dụng rộng rãi để lưu trữ và xử lý các tập hợp dữ liệu. Trong bài viết này, hãy cùng Rikkei Academy tìm hiểu về mảng trong Java từ khái niệm đến các thao tác với mảng phổ biến nhé!

Định nghĩa mảng trong Java

Mảng (array) trong Java là một cấu trúc dữ liệu được sử dụng để lưu trữ một tập hợp các giá trị cùng kiểu dữ liệu trong một vùng nhớ liên tiếp. Mỗi phần tử trong mảng được định danh bằng một chỉ số (index) duy nhất và có thể truy cập bằng cách sử dụng chỉ số đó.

Ví dụ: Để lưu trữ tập hợp điểm số của 40 sinh viên của một môn học nhất định, chúng ta sẽ cần sử dụng mảng. Khi cần trích xuất điểm của 10 sinh viên đầu tiên trong danh sách, ta có thể duyệt qua mảng và lấy giá trị của các phần tử có chỉ số từ 0-9.

Các kiểu mảng trong Java

Trong Java, mảng được chia làm các kiểu như sau:

Mảng một chiều

Cho phép lưu trữ nhiều phần tử cùng kiểu dữ liệu trong một vùng nhớ liên tiếp và truy xuất các phần tử này thông qua chỉ số. Mảng một chiều được sử dụng khi ta cần lưu trữ các phần tử đơn giản và truy xuất các phần tử này theo thứ tự tuyến tính.

Cú pháp:

[];

Mảng đa chiều

Cho phép lưu trữ các phần tử cùng kiểu dữ liệu theo dạng ma trận, các phần tử được sắp xếp theo hàng và cột. Mảng đa chiều được sử dụng khi ta cần lưu trữ và truy xuất các phần tử có cấu trúc phức tạp hơn. Thông thường, bạn sẽ hay làm việc với mảng 2 chiều hơn, mảng 2 chiều cũng chính là một trường hợp của mảng đa chiều.

Cú pháp:

[][];

Khai báo, khởi tạo và gán giá trị cho mảng trong Java

Trước khi thực hiện các thao tác với các phần tử trong mảng, chúng ta cần phải thực hiện các bước sau:

Khai báo mảng trong Java

Khai báo mảng giúp xác định kích thước của mảng và kiểu dữ liệu của các phần tử trong mảng. Từ đó, giúp Java cấp phát đủ bộ nhớ để lưu trữ các phần tử trong mảng và giúp cho việc xử lý dữ liệu trở nên chính xác và hiệu quả hơn. Nếu không, Java không thể biết được số lượng phần tử, khi đó, việc truy xuất và xử lý dữ liệu trong mảng sẽ bị lỗi do không có đủ bộ nhớ để lưu trữ các phần tử.

Để khai báo một mảng trong Java, bạn cần chỉ định kiểu dữ liệu của các phần tử trong mảng, kèm theo dấu ngoặc vuông [] và tên của mảng. Cú pháp:

[]

Khởi tạo mảng trong Java

Khi khai báo một mảng trong Java, Java sẽ không cấp phát bộ nhớ cho mảng đó tự động, để có thể sử dụng mảng đó, ta phải khởi tạo mảng để báo Java cấp phát bộ nhớ. Ngoài ra, việc khởi tạo mảng còn giúp gán giá trị cho các phần tử trong mảng, nếu không, các phân tử sẽ có giá trị mặc định của kiểu dữ liệu tương ứng, ví dụ với kiểu dữ liệu số, giá trị mặc định là 0.

Ở đây, chúng ta để cập đến cách khởi tạo mảng trong Java cơ bản nhất là sử dụng từ khóa “new” để tạo một mảng mới và chỉ định kích thước của mảng, có cú pháp như sau:

kiểuDữLiệu[] tênMảng = new kiểuDữLiệu[kíchThướcMảng];

Khi khởi tạo mảng bằng từ khóa “new”, các phần tử trong mảng sẽ có giá trị mặc định của kiểu dữ liệu tương ứng, ví dụ giá trị 0 với kiểu dữ liệu số.

Gán giá trị cho mảng trong Java

Sau khi khai báo và khởi tạo mảng trong Java, các phần tử trong mảng sẽ có giá trị mặc định của kiểu dữ liệu tương ứng. Tuy nhiên, nếu bạn muốn khởi tạo giá trị ban đầu cho phần tử trong mảng hoặc về sau bạn có ý định thay đổi giá trị phần tử và xử lý dữ liệu trong mảng thì việc gán giá trị là vô cùng cần thiết. Đối với mảng một chiều, ta chỉ cần sử dụng một chỉ số, còn đối với mảng hai chiều, ta cần sử dụng hai chỉ số.

Cú pháp:

[] = ;

Ví dụ, để gán giá trị 10 cho phần tử thứ 2 trong mảng myArray:

Khai báo, khởi tạo và gán giá trị cho mảng đồng thời

Trong Java, chúng ta cũng có thể khai báo, khởi tạo và gán giá trị cho mảng đồng thời trong cùng một dòng mã. Để làm điều này, chúng ta sử dụng cú pháp:

type[] arrayName = {value1, value2, value3, …};

Một số thao tác cơ bản với mảng trong Java

Trên thực tế, khi làm việc với mảng, bạn sẽ gặp phải khối lượng dữ liệu lớn. Vì vậy, chúng ta sẽ cần sử dụng các thao tác khác nhau để và để xử lý, phân tích khối dữ liệu đó, phục vụ các mục đích sử dụng khác nhau. Trong Java có tích hợp các phương thức sẵn có giúp bạn thực hiện các thao tác một cách dễ dàng và nhanh chóng.

Sắp xếp mảng

Khi nào bạn cần sắp xếp mảng? Khi bạn muốn sắp xếp các phần tử theo thứ tự nhất định hoặc theo tiêu chí nào đó, chẳng hạn như tăng dần hoặc giảm dần. Các cách để sắp xếp mảng:

Sử dụng phương thức Arrays.sort() để sắp xếp các phần tử trong một mảng theo thứ tự từ nhỏ đến lớn hoặc từ lớn đến nhỏ.

Cú pháp:

Ví dụ:

int[] array = {5, 3, 1, 4, 2};

Arrays.sort(array);

Sử dụng phương thức Arrays.parallelSort() tương tự như Arrays.sort(), nhưng thực thi song song trên nhiều luồng để tăng tốc độ sắp xếp.

Cú pháp:

Arrays.parallelSort(array);

Ví dụ:

int[] array = {5, 3, 1, 4, 2};

Arrays.parallelSort(array);

Ngoài ra, nếu bạn muốn sắp xếp một mảng theo một cách cụ thể hoặc tùy chỉnh, bạn có thể sử dụng các thuật toán sắp xếp như Bubble Sort hoặc Quick Sort. Tuy nhiên, ở đây chúng ta sẽ không bàn luận về vấn đề này mà tập trung nắm chắc các kiến thức cơ bản trước.

Sao chép một mảng

Ta sao chép một mảng khi ta muốn đảm bảo tính toàn vẹn của dữ liệu và tránh các lỗi không mong muốn khi xử lý mảng thì có thể sử dụng sao chép mảng.

Để sao chép một mảng trong Java, bạn có thể sử dụng một trong các cách sau đây:

  • Sử dụng vòng lặp for để sao chép từng phần tử của mảng gốc sang mảng mới

Cú pháp:

for(int i = 0; i < oldArray.length; i++){

newArray[i] = oldArray[i];

}

Ví dụ:

int[] oldArray = {1, 2, 3, 4, 5};

int[] newArray = new int[oldArray.length];

for(int i = 0; i < oldArray.length; i++){

newArray[i] = oldArray[i];

}

  • Sử dụng phương thức System.arraycopy() để sao chép một phần của mảng hoặc toàn bộ mảng.

Cú pháp:

System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);

Ví dụ:

int[] oldArray = {1, 2, 3, 4, 5};

int[] newArray = new int[oldArray.length];

System.arraycopy(oldArray, 0, newArray, 0, oldArray.length);

}

  • Sử dụng phương thức Arrays.copyOf() để sao chép một mảng.

Cú pháp:

int[] newArray = Arrays.copyOf(oldArray, oldArray.length);

Ví dụ:

int[] oldArray = {1, 2, 3, 4, 5};

int[] newArray = Arrays.copyOf(oldArray, oldArray.length);

Các thao tác với phần tử của mảng

Phần tử của mảng là giá trị được lưu trữ trong mảng tại một vị trí cụ thể. Mỗi phần tử của mảng có một chỉ số (index) riêng biệt để truy cập và thao tác với nó.

Tìm kiếm phần tử trong mảng

Để tìm kiếm phần tử trong mảng, bạn có thể sử dụng vòng lặp để duyệt qua từng phần tử và so sánh giá trị của chúng với giá trị cần tìm.

Cú pháp:

for (int i = 0; i < array.length; i++) {

if (array[i] == valueToFind) {

// Làm gì đó với vị trí tìm được

}

}

Ví dụ:

int[] numbers = {1, 2, 3, 4, 5};

int valueToFind = 3;

for (int i = 0; i < numbers.length; i++) {

if (numbers[i] == valueToFind) {

System.out.println(“Found ” + valueToFind + ” at index ” + i);

break;

}

}

Truy cập phần tử trong mảng

Truy cập phần tử trong mảng giúp lấy giá trị của phần tử tại một chỉ số nhất định. Để truy cập phần tử trong mảng, bạn sử dụng chỉ số của phần tử đó:

element = [];

Ví dụ:

int[] numbers = {1, 2, 3, 4, 5};

int elementAtIndex2 = numbers[2];

System.out.println(“Element at index 2: ” + elementAtIndex2); // Output: Element at index 2: 3

Thay đổi phần tử trong mảng

Thay đổi phần tử trong mảng giúp cập nhật giá trị của phần tử tại một chỉ số nhất định. Để thay đổi phần tử trong mảng, bạn sử dụng chỉ số của phần tử đó và gán giá trị mới:

[] = ;

Ví dụ:

int[] numbers = {1, 2, 3, 4, 5};

numbers[2] = 7;

System.out.println(“Updated element at index 2: ” + numbers[2]); // Output: Updated element at index 2: 7

Độ dài mảng

Độ dài mảng giúp xác định số lượng phần tử trong mảng, từ đó hỗ trợ việc duyệt qua mảng, cũng như kiểm soát không truy cập ngoài phạm vicủa mảng, tránh gây ra lỗi ArrayIndexOutOfBoundsException. Để lấy độ dài của mảng, bạn sử dụng thuộc tính length của mảng:

int length = .length;

Ví dụ:

int[] numbers = {1, 2, 3, 4, 5};

int length = numbers.length;

System.out.println(“Length of the array: ” + length); // Output: Length of the array: 5

Duyệt phần tử của mảng

Duyệt phần tử giúp ta lần lượt truy cập từng phần tử trong mảng từ đó giúp thực hiện các thao tác xử lý dữ liệu như tính tổng, tìm giá trị lớn nhất…Để duyệt phần tử của mảng có thể sử dụng vòng lặp for hoặc vòng lặp for-each.

  • Vòng lặp for: sử dụng một biến đếm để truy cập các phần tử trong mảng

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

element = [i];

// Làm gì đó với phần tử ‘element’

}

  • Vòng lặp for-each: sử dụng một biến để lưu trữ giá trị của từng phần tử trong mảng.

for ( element : ) {

// Làm gì đó với phần tử ‘element’

}

Nhìn chung, foreach là đơn giản và dễ đọc hơn for, cũng như giảm thiểu khả năng xảy ra lỗi do truy cập sai chỉ số mảng (out-of-bounds error). Tuy nhiên, nó không thể truy cập được các phần tử ở vị trí cụ thể của mảng, chỉ có thể truy cập từng phần tử theo thứ tự. Nếu ta cần truy cập vào mảng ngược (reverse array), ta cần sử dụng for thay vì foreach.

Phương thức và mảng trong Java

Trong Java, bạn có thể sử dụng mảng như một tham số đầu vào hoặc kết quả trả về của một phương thức. Điều này giúp chúng ta xử lý các tác vụ liên quan đến mảng một cách hiệu quả và linh hoạt hơn, giúp giảm thiểu sự trùng lặp mã, tăng tính tái sử dụng và đảm bảo tính ổn định của chương trình và giảm thiểu khả năng xảy ra lỗi.

Truyền mảng vào phương thức

Bạn có thể truyền một mảng vào phương thức như một tham số bình thường. Để làm điều này, bạn chỉ cần khai báo kiểu dữ liệu của mảng và tên biến trong danh sách tham số của phương thức. Ở đây, chúng ta sử dụng phương thức printArray

Ví dụ:

public static void printArray(int[] array) {

for (int number : array) {

System.out.print(number + ” “);

}

System.out.println();

}

Trả về mảng từ phương thức

Để trả về một mảng từ phương thức, bạn cần khai báo kiểu dữ liệu của mảng và sử dụng từ khoá return để trả về mảng đó. Ngoài ra, khii trả về mảng từ phương thức, chúng ta cũng cần lưu ý về việc quản lý bộ nhớ và đảm bảo tính toàn vẹn của dữ liệu. Ở đây, chúng ta sử dụng phương thức createArray:

Ví dụ:

public static int[] createArray(int size) {

int[] newArray = new int[size];

for (int i = 0; i < size; i++) {

newArray[i] = i + 1;

}

return newArray;

Sử dụng mảng tham số biến

Trong Java, bạn có thể sử dụng tham số biến (varargs) để truyền một số lượng tham số tùy ý vào phương thức. Để sử dụng varargs, bạn cần khai báo kiểu dữ liệu của tham số, kèm theo dấu ba chấm (…) trước tên biến. Ở đây, chúng ta sử dụng phương thức printVarargs

Ví dụ:

public static void printVarargs(int… numbers) {

for (int number : numbers) {

System.out.print(number + ” “);

}

System.out.println();

}

Ưu điểm và nhược điểm của mảng trong Java

Mảng được sử dụng để lưu trữ một tập hợp các giá trị cùng kiểu dữ liệu, trong quá trình lập trình, mảng có nhiều ưu điểm nhưng cũng có một số khuyết điểm bạn cần lưu ý:

Ưu điểm

  • Cung cấp phương tiện lưu trữ và truy xuất các phần tử cùng kiểu dữ liệu trong một vùng nhớ liên tiếp, giúp cho việc quản lý dữ liệu trở nên dễ dàng.
  • Cho phép truy xuất các phần tử trong mảng theo chỉ số, giúp cho việc truy xuất dữ liệu nhanh chóng và dễ dàng.
  • Dễ dàng tạo ra các mảng đa chiều (multidimensional array) để lưu trữ dữ liệu có cấu trúc phức tạp hơn.
  • Hỗ trợ các thao tác tính toán trên mảng như sắp xếp, tìm kiếm, lọc, …

Nhược điểm

  • Mảng có kích thước cố định khi khai báo, nếu cần thêm phần tử mới, ta phải tạo một mảng mới với kích thước lớn hơn và sao chép dữ liệu từ mảng cũ sang mảng mới. Điều này có thể làm tốn thời gian và tài nguyên của hệ thống.
  • Không thể chứa các phần tử khác kiểu dữ liệu trong cùng một mảng.
  • Không có cơ chế tự động quản lý vùng nhớ của các phần tử trong mảng. Việc không giải phóng bộ nhớ tạo ra các vấn đề liên quan đến rò rỉ bộ nhớ (memory leak).
  • Khó khăn trong việc thực hiện các thao tác chèn, xóa phần tử giữa mảng.

Tìm hiểu lớp Array trong Java

Trong Java, việc làm việc với mảng và các cấu trúc dữ liệu liên quan đôi khi đòi hỏi các tác vụ phức tạp. Java cung cấp một số lớp hỗ trợ giúp thao tác với mảng và các cấu trúc dữ liệu tương tự trở nên dễ dàng hơn.

Lớp java.util.Arrays cung cấp các phương thức tiện ích để làm việc với mảng trong Java. Dưới đây là bảng trình bày thông tin về các phương thức trong lớp java.util.Arrays:

Phương thức Mô tả sort() Sắp xếp các phần tử trong mảng theo thứ tự tăng dần hoặc giảm dần. binarySearch() Tìm kiếm một phần tử trong mảng đã sắp xếp. copyOf() Sao chép một mảng đã cho sang một mảng mới với độ dài mới. Nếu độ dài mới lớn hơn độ dài của mảng ban đầu, các phần tử mới sẽ được điền vào giá trị mặc định của kiểu dữ liệu tương ứng. fill() Điền một giá trị đã cho vào tất cả các phần tử của mảng. equals() So sánh hai mảng để xem chúng có bằng nhau không. toString() Chuyển một mảng thành một chuỗi. deepToString() Chuyển một mảng đa chiều thành một chuỗi. asList() Chuyển một mảng thành một danh sách (List). hashCode() Trả về giá trị băm (hash code) của mảng. parallelPrefix() Tính toán tích lũy (prefix sum) của mảng. parallelSetAll() Tạo một mảng mới bằng cách ánh xạ các chỉ số của mảng đến các giá trị mới được tính toán bằng cách sử dụng một biểu thức lambda. parallelSort() Sắp xếp các phần tử trong mảng theo thứ tự tăng dần hoặc giảm dần, sử dụng đa luồng (parallel). setAll() Tạo một mảng mới bằng cách ánh xạ các chỉ số của mảng đến các giá trị mới được tính toán bằng cách sử dụng một biểu thức lambda. spliterator() Tạo một Spliterator trên các phần tử trong mảng.

Kết luận

Việc hiểu được mảng trong Java là rất quan trọng để bạn có thể phát triển các ứng dụng Java hiệu quả. Vì vậy, hãy hãy cố gắng luyện tập nhuần nhuyễn cách thao tác với mảng trong Java để bạn có thể nắm vững kiến thức và cách xử lý mảng nhé!

Nếu bạn đang tìm kiếm địa chỉ học Java uy tín, chất lượng thì hãy tham khảo khóa học lập trình tại Rikkei Academy nhé! Với thời lượng chỉ trong 6 tháng nhưng cung cấp đầy đủ cho bạn các kiến thức, kỹ năng cần thiết để trở thành lập trình viên tiêu chuẩn. Đặc biệt, Học viên cam kết việc làm đầu ra ngay sau khi bạn tốt nghiệp khóa học! Để tìm hiểu thêm thông tin chi tiết, đăng ký nhận tư vấn miễn phí ngay tại đây!