Arraylist là gì
Video hướng dẫn:Tạo ArrayListMột trong những nhược điểm lớn của mảng thông thườnglà kích thước của nó là cố định trong quá trình tạo mảng, rồi sau đó kích thước rất khóđược thay đổi trong quá trình thực thi chương trình. Tuy nhiên, đôi khi ta không thể biết chính xác là có bao nhiêu phần tử sẽ được lưu trong mảng. Ví dụ, khi một người đang mua sắmtrực tuyến, số lượng các sản phẩm mà sẽ được đưa vào giỏ hàng là không cố định từ đầu. Trong trường hợp này, ta có thể phải tạo một mảng với kích thước lớn nhất có thể để lưu tất cả các sản phẩm mà người dùng muốn mua. Tuy nhiên, nếu người dùng chỉ thêm vào giỏ hàngmột vài sản phẩm thì coi như phần còn lại của bộ nhớ sẽ trở thành dư thừa, tức là gây lãng phí, ảnh hưởng đến hiệu năng của chương trình. Tương tự như vậy, nếu người dùng cố gắng thêm thật nhiều sản phẩm vào giỏ hàng dẫn đến vượt quá kích thước mảng thì sẽ phát sinh lỗi. Ngoài ra, việc thêm và bớt phần tử đối với mảng thông thườnglà một tác vụ khó. Một nhược điểm nữa của mảng là nó chỉ lưa trữ được một kiểu dữ liệu mà thôi. Để giải quyết những vấn đề trên, thì ta cần phải có một cấu trúc vùng nhớ mà có thể được cấp phát tùy vào yêu cầu thực tế. Ngoài ra, việc thêm và bớt các giá trị cũng cần phải được giải quyết một cách dễ dàng. Java cung cấp khái niệm tập hợp để giải quyết vần đề này. Một tập hợp là một đối tượng đơn trong đó nhóm nhiều phần tử vào trong một đơn vị. Các tập hợp được dùng để lưu, truy xuất, và thao tác dữ liệu một cách tổng hợp. Thông thường thì các tập hợp sẽ đại diện cho các thành phần dữ liệu tạo thành một nhóm mang tính thực tếtự nhiên, chẳng hạn như tập hợp các thẻ, tập hợp các ký tự, một danh sách các số điện thoại, một danh sách sinh viên. Java cung cấp các giao diện (interface) tập hợp để tạo ra các loại tập hợp khác nhau. Giao diện cơ bản là làCollection trong đó cho phép thao tác với các loại tập hợp khác nhau như thể hiện ở hình dưới đây. Các giao diện tập hợp cơ bản Mục đích chính của việc sử dụng từng giao diện tập hợp được thể hiện như bảng dưới đây.
Các khả năng thực thi khác nhau của các loại tập hợp khác nhau có thể được sử dụng trong những tình huống khác nhau. Tuy nhiên, ArrayList, HashSet, vàHashMapđược sử dụng thường xuyên nhất trong các ứng dụng. Ngoài ra, các giao diện gồmSortedSet vàSortedMap không được đưara trong bảng liệt kê ở trênvì mỗi loại này có một sự thực thiTreeSet vàTreeMap tương ứng được liệt kê trong các hàngSet và Map. Hàng đợi có hai sự thực thi làLinkedList dùng để thực thiList vàPriorityQueue không được thể hiệntrong bảng. Hai loại thực thi này cung cấp những ý nghĩa rất khác nhau. LinkedList sử dụng thứ tựFirst In First Out (FIFO), trong khi PriorityQueue lại sắp xếp các phần tử theo giá trị mà chúng chứa. Mỗi một sự thực thi cung cấp tất cả các hoạt động tùy chọnthể hiện trong giao diệncủa nó. Tất cả các loại thực thực thi đều chấp nhận các phần tử, khóa và giá trị null. Để sử dụng giao diệnthì người dùng phải khai báo gói java.util trong lớp. Lưu ý:Một gói là một tập hợp các lớp có liên quan. Gói java.utilbao gồm một tập hợptất cả các giao diện và các lớp. LớpArrayList là tập hợp được sử dụng thường xuyên nhất, nó có những đặc điểm sau đây: - Rất linh hoạt trong việc tăng hoặc giảm kích thước khi cần. - Cung cấp một số phương thức hữu dụng để thao tác với tập hợp. - Chèn và xóa dữ liệu dễ dàng. - Có thể truy xuất bằng cách sử dụng vòng lặp for, vòng lặp for cải tiến, hoặc các loại vòng lặp khác. ArrayList cung cấp các phương thức để thao tác với kích thước của mảng, nó thừa kế từAbstractList và thực thi các giao diện như List,Cloneable, vàSerializable. Capacity của mộtArrayList tăng lên hoặc giảm đi một cách tự động. Nó lưu tất cả các phần tử với các kiểu khác nhau, bao gồm cả null. Bảng dưới đây trình bày các hàm tạo của ArrayList.
ArrayList bao gồm một số phương thức dùng để thêm phần tử. Những phương thức này có thể chia thành các nhóm như sau: - Các phương thức thêm một hoặc nhiều phần tử vào cuối danh sách. - Các phương thức chèn một hoặc nhiều phần tử vào mọt vị trí mong muốn trong danh sách. Các phương thức cơ bản của ArrayList được thể hiện như bảng dưới đây.
Để truy xuất mộtArrayList thì ta có thể sử dụng các cáchnhư sau: - Vòng lặp for - Vòng lặp for cải tiến - Iterator - ListIterator Giao diệnIterator cung cấp các phương thức truy xuất một tập dữ liệu. Nó có thể được sử dụng với mảng cũng như lớp của frameworkCollection. Iterator cung cấp những phương thức truy xuất tập hợp như sau: - next(): Trả về phần tử tiếp theo của tập hợp. - hasNext(): Trả về true nếu còn phần tử trong tập hợp. - remove(): Xóa phần tử tương ứng của tập hợp. Không có phương thức đặc biệt nào dùng để sắp xếp đối vớiArrayList. Tuy nhiên, ta có thể sử dụng phương thứcsort() của lớpCollections để sắp xếp. Cú pháp sử dụng phương thức sort()như sau: Cú pháp:Collections.sort(
Đoạn mã 1 dưới đâythể hiện việc tạo thể hiệnvà khởi tạo mộtArrayList. ArrayList marks = new ArrayList(); // Tạo một thể củaArrayList
marks.add(67); // Khởi tạoArrayList marks.add(50); Thao tác vớiArrayListMỗiArrayList có thể được truy xuất bằng cách sử dụng vòng lặp for hoặc bằng cách sử dụng giao diệnIterator. Đoạn mã 2 thể hiện việc sử dụng ArrayList có tênmarksđể thêm và hiển thị điểm của sinh viên. import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
public class ArrayLists {
//tạo một thể hiện của ArrayList
ArrayList marks = new ArrayList(); // line 1
//phương thức lưu trữ điểm số vào ArrayList marks
public void storeMarks(){
System.out.println("Storing marks. Please wait...");
marks.add(67); // line 2
marks.add(50);
marks.add(45);
marks.add(75);
}
//phương thức hiển thị điểm số
public void displayMarks() {
System.out.println("Marks are:");
//dùng vòng lặp for để truy xuất các phần tử
System.out.println("Iterating ArrayList using for loop:");
for (int i = 0; i < marks.size(); i++) {
System.out.println(marks.get(i));
}
System.out.println("-------------------------------------");
//dùnggiao diệnIterator đểtruy xuất ArrayList
Iterator imarks = marks.iterator(); // line 3
System.out.println("Iterating ArrayList using Iterator:");
while (imarks.hasNext()) { // line 4
System.out.println(imarks.next()); // line 5
}
System.out.println("-------------------------------------");
//sắp xếp danh sách bằng cách dùng phương thức sort() của lớp Collections
Collections.sort(marks); // line 6
System.out.println("Sorted list is: " + marks);
}
public static void main(String[] args) {
ArrayLists obj = new ArrayLists(); // line 7
obj.storeMarks();
obj.displayMarks();
}
}
Phân tích đoạn mã: ArrayList có tênmarksđược tạo ở line 1. Phương thứcstoreMarks()được dùng để thêm các phần tử vào tập hợp bằng cách sử dụng phương thức barks.add()như line 2. Trong phương thứcdisplayMarks()co một vòng lặp for được sử dụng để truy xuấtArrayListmarkstừ phần tử có chỉ số0 đếnmarks.size(). Phương thứcget() được dùng để truy xuất phần tử có chỉ sối. Tương tự như vậy, đối tượng có kiểuIterator làimarksđược tạo ra ở line 3 và gắn vớimarksthông qua việc sử dụng phưng thứcmarks.iterator(). Nó được sử dụng để lấy các phần tử của tập hợp. Giao diệnIterator cung cấp phương thứchasNext() để kiểm tra xem có còn phần tử nào trong tâp hợp nữa không thông qua line 4. Phương thứcnext() được dùng để truy xuất phần tử tiếp theo trong tập hợp. Phần tử đã được truy xuất sẽ được hiển thị ra console tại line 5. Phương thức tĩnhsort() của lớpCollections được dùng để sắp xếpArrayListmarksnhư ở line 6 và in các giá trị ra màn hình. Trong phương thứcmain() thì đối tượng của lớpArrayListsđược tạo tại line 7 và cácphương thứcstoreMarks()vàdisplayMarks()được gọi. Output của đoạn mã trên như sau: Các giá trị của mộtArrayList cũng có thể được in ra bằng cách đơn giản là viếtSystem.out.println("Marksare:"+ marks). Trong trường hợp ví dụ trên thì output sẽ là:Marks are:[67, 50, 45, 75]. Xem thêm:
|