Java: Mảng một chiều trong Java

Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực

Giới thiệu về mảng

Xét trường hợp trong đó một người dùng muốn lưu trữ điểm của mười sinh viên. Với mục đích này, người dùng có thể tạo mười biến khác nhau có kiểu nguyên và lưu trữ điểm vào chúng. Điều gì xảy ra nếu người dùng muốn lưu trữ điểm của một trăm hoặc một nghìn sinh viên? Trong trường hợp này, anh ta cũng lại phải tạo ra 100 hoặc 1000 biến tương ứng để lưu dữ liệu. Như vậy thì anh ta sẽ phải tốn khá nhiều thời gian để thực hiện một công việc duy nhất là khai báo các biến riêng lẻ. Giá như tất cả các điểm số đều có thể được lưu trữ ở một vùng nhớ và việc truy cập điểm chỉ thông qua một tên duy nhất thì rất tiện. Java có thể cho chúng ta thực hiện được điều này bằng cách sử dụng biện pháp gọi là Mảng (Array).

Một mảng là một bộ dữ liệu cụ thể mà có thể lưu trữ được các giá trị cố định có cùng kiểu tại những vùng nhớ được đặt liên tiếp nhau. Mảng trong Java được thực thi như là đối tượng. Kích thước của mảng phụ thuộc vào số lượng các giá trị mà nó có thể lưu trữ và được xác định khi tạo mảng. Sau khi tạo mảng thì kích thước của nó là cố định.

java-so-do-the-hien-mang

Hình trên thể hiện một mảng gồm mười số nguyên lưu trữ các giá trị như 20, 100, 40, ... Mỗi giá trị trong mảng được gọi là phần tử mảng. Các số từ 0 đến 9 là các chỉ số của các phần tử trong mảng. Độ dài hay kích thước của mảng là 10. Chỉ số đầu tiên bắt đầu là 0, và như vậy chỉ số cuối cùng sẽ luôn là [kích thước-1]. Tức là, phần tử cuối cùng của mảng trên có chỉ số là 9.

Mảng có thể được tạo từ kiểu dữ liệu nguyên thủy hoặc tham chiếu, các phần tử mảng được truy cập bằng cách sử dụng tên mảng và đi kèm là chỉ số tương ứng. Các giá trị của một mảng được lưu trữ tại các vùng nhớ liên tục nhau trong bộ nhớ, điều này sẽ dẫn đến tốn ít chi phí trên hệ thống khi tiến hành tìm kiếm các giá trị. Việc sử dụng mảng có những lợi điểm như sau:

- Mảng là cách tốt nhất để hoạt động trên nhiều phần tử dữ liệu cùng kiểu tại cùng một thời điểm.

- Mảng sẽ tối ưu hóa việc sử dụng tài nguyên bộ nhớ hơn so với việc sử dụng các biến riêng biệt.

- Bộ nhớ chỉ được gán cho một mảng tại thời điểm khi mảng thực sự được sử dụng. Vì thế, khi khai báo mảng thì bộ nhớ không hề được tiêu thụ.

Mảng trong Java có hai loại sau là mảng một chiều và mảng đa chiều (hay nhiều chiều).

Khai báo, tạo thể hiện, khởi tạo và nhập liệu mảng một chiều

Có thể hình dung một cách trực quan rằng mảng một chiều được thể hiện như là một bảng gồm một cột và nhiều hàng. Mỗi phần tử của mảng được truy cập bằng cách sử dụng tên mảng và chỉ số tương ứng với phần tử đó.

Để tạo một mảng ta thực hiện các công việc như sau (lưu ý là tên mảng phải tuân theo quy tắc đặt tên chung, giống như đặt tên cho biến):

Khai báo một mảng

Công việc này tương tự như khai báo một biến bất kỳ. Khai báo một mảng sẽ báo cho trình biên dịch rằng biến sẽ chứa một mảng có kiểu dữ liệu xác định. Cú pháp cho việc khai báo là như sau:

kiểu_dữ_liệu[] tên_mảng;
Hoặc:
kiểu_dữ_liệu tên_mảng[];

trong đó,

kiểu_dữ_liệu: Chỉ ra kiểu dữ liệu của các phần tử mà sẽ được lưu trữ trong mảng.

Cặp []: Chỉ ra rằng biến là một mảng.

tên_mảng: Là tên mà sau đó sẽ được dùng để truy cập các phần tử của mảng.

Ví dụ sau đây sẽ khai báo các loại mảng với các kiểu dữ liệu khác nhau nhưng chưa có kích thước.

int[] diem;
byte[] mangByte;
float[] mangFloat;
boolean[] mangLogic;
char[] mangKyTu;
String[] mangChuoi;

Tạo thể hiện cho mảng

Vì mảng là một đối tượng, nên vùng nhớ chỉ được cấp phát khi nó có thể hiện. Cú pháp tạo thể hiện cho mảng là như sau:

<tên_mảng> = new kiểu_dữ_liệu[kích_thước];

trong đó,

new: Cấp phát vùng nhớ cho mảng.

kích_thước: Số lượng phần tử của mảng.

Ví dụ,

diem = new int[5];

Khởi tạo cho mảng

Vì mảng là một đối tượng mà có thể lưu trữ nhiều giá trị, nên mảng cần phải được khởi tạo. Ta có thể sử dụng một trong hai cách sau đây để khởi tạo mảng:

Khởi tạo khi tạo mảng

Để khởi tạo một mảng một chiều ngay trong quá trình tạo mảng, ta phải xác định các giá trị cụ thể muốn khởi tạo. Ví dụ:

int[] diem = {65, 47, 75, 50};

Chú ý rằng trong khi khởi tạo một mảng theo cách này thì ta không dùng từ khóa new hay kích thước mảng. Đó là bởi vì tất cả các phần tử được lưu trữ thì đều được xác định và phù hợp với bộ nhớ được tự động cấp phát dựa trên số phần tử mảng. Cách này còn được gọi là khai báo đồng thời khởi tạo.

Khởi tạo sau khi tạo mảng

Với cách này thì các phần tử khác nhau của mảng cần được khởi tạo các giá trị khác nhau theo từng câu lệnh khởi tạo. Ví dụ:

int[] diem = new int[5];
diem[0] = 12;
diem[1] = 34;
diem[2] = 56;
diem[3] = 78;
diem[4] = 90;

Lưu ý rằng với cách này thì mảng phải được khởi tạo với kích thước cụ thể. Đó là bởi vì các giá trị thực sự được xác định sau đó và để lưu chúng thì bộ nhớ phải được cấp phát khi tạo mảng.

Ta cũng có thể tạo một mảng theo ba bước như ví dụ dưới đây:

int[] diem; //khai báo mảng
diem = new int[4]; //tạo thể hiện cho mảng
diem[0] = 65; //khởi tạo mảng

Đoạn mã 1 thể hiện một ví dụ về cách sử dụng và thao tác mảng một chiều.

Đoạn mã 1:

public class MangMotChieu {
    //Khai báo mảng một chiều có tên
diemSo
    int[] diemSo; // dòng 1
    /* Định nghĩa phương thức tạo thể hiện và khởi tạo mảng */
    public void luuDiemSo() {
      // Tạo thể hiện cho mảng
     
diemSo = new int[5]; // dòng 2
      System.out.println("Đang lưu điểm. Vui lòng chờ...");
      // Khởi tạo các phần tử mảng
     
diemSo[0] = 12; // dòng 3
     
diemSo[1] = 34;
     
diemSo[2] = 56;
     
diemSo[3] = 78;
     
diemSo[4] = 90;
    }

    /* Định nghĩa phương thức hiển thị các điểm số lưu trong mảng */
    public void xemDiemSo() {
      System.out.println("Các điểm số:");
      System.out.println(
diemSo[0]);
      System.out.println(diemSo[1]);
      System.out.println(diemSo[2]);
      System.out.println(diemSo[3]);
      System.out.println(diemSo[4]);
    }
    public static void main(String[] args) { //Phương thức main()
      MangMotChieu objMotChieu = new MangMotChieu(); //dòng 4
      // Gọi phương thức
luuDiemSo()
      objMotChieu.
luuDiemSo(); // dòng 5
      // Gọi phương thức
xemDiemSo()
      objMotChieu.
xemDiemSo(); // dòng 6
    }
}

Trong đoạn mã trên, lớp MangMotChieu bao gồm một mảng có tên diemSo[] được khai báo ở dòng 1. Để tạo thể hiện và khởi tạo cho các phần tử của mảng thì phương thức luuDiemSo() được tạo. Mảng được tạo thể hiện bằng cách sử dụng từ khóa newdòng 2. Các phần từ của mảng được gán các giá trị khởi tạo bằng cách sử dụng tên mảng và chỉ số của phần tử. Tương tự, để hiển thị các phần tử mảng thì ta tạo phương thức xemDiemSo(). Đối tượng objMotChieu của lớp được tạo ở dòng 4, nó được dùng để gọi các phương thức luuDiemSo() xemDiemSo().

Dùng vòng lặp để xử lý và khởi tạo mảng

Giả sử khi một người dùng hiển thị 100 hoặc 1000 giá trị của mảng, thì nếu sử dụng các phương thức được đề cập ở Đoạn mã 1 sẽ trở nên rất tẻ nhạt và tốn thời gian. Trong trường hợp này, ta có thể sử dụng vòng lặp để xử lý cũng như khởi tạo cho mảng. Đoạn mã 2 dưới đây định nghĩa lại phương thức xemDiemSo() để tránh vấn đề này.

Đoạn mã 2:

...
public void xemDiemSo() {
  System.out.println("Các điểm số:");
  // Hiển thị các điểm số sử dụng vòng lặp for
  for(int dem = 0; dem < diemSo.length; dem++) {
    System.out.println(diemSo[dem]);
  }

}
...

Trong đoạn mã trên, một vòng lặp for được dùng để lặp mảng từ 0 đến diemSo.length-1. Ở đây thuộc tính length của mảng được dùng để lấy kích thước của nó. Trong vòng lặp, mỗi phần tử được hiển thị bằng cách sử dụng tên phần tử và biến dem, cụ thể là diemSo[dem].

Ta cũng có thể sử dụng vòng lặp cải tiến để lặp qua mảng. Đoạn mã 3 thể hiện phương thức xemDiemSo() trong đó thay vòng lặp for thông thường bằng vòng lặp for cải tiến.

Đoạn mã 3:

...
public void xemDiemSo() {

  System.out.println("Các điểm số");
  // Hiển thị các điểm số sử dụng vòng lặp for cải tiến
  for(int giaTri:diemSo) {
    System.out.println(giaTri);
  }

}
...

Ở đoạn mã trên bạn thấy vòng lặp sẽ in ra tất cả các giá trị của mảng diemSo[] mà không cần phải sử dụng chỉ số để thể hiện từng phần tử nó như vòng lặp for thường nữa.

Nhập liệu cho mảng một chiều

Vòng lặp for được xem là cách tốt nhất để nhập liệu cho các phần tử của mảng. Đoạn mã 4 thể hiện việc thêm một phương thức nhapLieu() cho lớp MangMotChieu ở Đoạn mã 1.

Đoạn mã 4:

public void nhapLieu() {
  Scanner input = new Scanner(System.in);
  System.out.println("Mời bạn nhập liệu cho mảng:");
  for(int i=0; i<diemSo.length; i++){
    System.out.printf("Phần tử thứ %d: ", i+1);
    diemSo[i] = input.nextInt();
  }
}

Xem thêm:

» Tiếp: Mảng hai chiều trong Java
« Trước: Bài tập phần vòng lặp
Các khóa học qua video:
Python SQL Server PHP C# Lập trình C Java HTML5-CSS3-JavaScript
Học trên YouTube <76K/tháng. Đăng ký Hội viên
Viết nhanh hơn - Học tốt hơn
Giải phóng thời gian, khai phóng năng lực
Copied !!!