Arraylist là gì

Video hướng dẫn:

Tạo ArrayList

Mộ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.

Giao diện Hash table Resizable array Tree Linked list Hash table + Linked list
Set HashSet TreeSet LinkedHashSet
List ArrayList LinkedList
Queue
Map HashMap TreeMap LinkedHashMap
Xem thêm  Background service là gì

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.

Hàm tạo Mô tả
ArrayList() Tạo một ArrayList rỗng với capacity khởi tạo là 10.
ArrayList(Collection c) Tạo một ArrayList bao gồm các phần tử của tập hợp c
ArrayList(int capacity) Tạo một ArrayList với capacity cho trước. Capacity là kích thước của ArrayList, nó chỉ ra số lượng tối đa mà ArrayList có thể lưu, nhưng nếu kích thước tăng lên vượt quá capacity thì capacity của ArrayList sẽ tự động tăng lên.

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.

Xem thêm  Tại sao bkav bị ghét
Phương thức Mô tả
void add(int index,Object element) Chèn phần tử element vào ArrayList tại vị trí có chỉ số index. Nếu index>=size() hoặc <0 thì phương thức này ném ra ngoại lệ IndexOutOfBoundsException.
boolean add(Object o) Thêm một phần tử vào cuối danh sách.
booleanaddAll(Collection c) Thêm tất cả các phần tử của tập hợp c vào cuối danh sách. Nếu c null thì phương thức này sẽ ném ra ngoại lệ NullPointerException.
boolean addAll(intindex, Collection c) Chèn tất cả các phần tử của tập hợp c vào vị trí có chỉ số index trong danh sách. Nếu c null thì phương thức ném ra ngoại lệ NullPointerException.
void clear() Xóa tất cả các phần tử khỏi danh sách.
Object clone() Trả về một bản copy của ArrayList hiện thời.
boolean contains(Objecto) Trả về true nếu danh sách có chứa phần tử o.
void ensureCapacity(intminCapacity) Thay đổi capacity của ArrayList nếu cần để đảm bảo nó có thể lưu tất cả các phần tử hiện có trong danh sách với capacity nhỏ nhất.
Object get(int index) Trả về phần tử có chỉ số index. Nếu index>=size() hoặc index<0 thì phương thức sẽ ném ngoại lệ
IndexOutOfBoundsException.
int indexOf(Object o) Trả về chỉ số của phần tử o. Nếu không tìm thấy phần tử o thì trả về -1.
int lastIndexOf(Objecto) Trả về chỉ số của phần tử o cuối cùng trong danh sách. Nếu không tìm thấy thì trả về -1.
Object remove(int index) Xóa phần tử có chỉ số index. Nếu index >= size() hoặc index < 0 thì ném ra ngoại lệ throwsIndexOutOfBoundsException.
protected void removeRange(int fromIndex, int toIndex) Xóa tất cả các phần tử mà có chỉ số nằm trong đoạn [fromIndex,toIndex].
Object set(int index,Object element) Thay phần tử có chỉ số index bằng phần tử element. Nếu index >= size() hoặc index<0 thì ném ra ngoại lệ throws IndexOutOfBoundsException.
int size() Trả về số lượng phần tử có trong danh sách.
Object[] toArray() Xuất ra tất cả các phần tử có trong danh sách. Nếu danh sách null thì ném ngoại lệ NullPointerException.
Object[]toArray(Object[] a) Xuất ra tất cả các phần tử có trong danh sách ra mảng a.
void trimToSize() Đặt capacity bằng với kích thước hiện thời của mảng.

Để 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:

Xem thêm  Kỹ năng bán hàng tiếng anh là gì?

Cú pháp:

Collections.sort(<list-name>);

Đ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ớiArrayList

Mỗ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:

  • Video demo cách sử dụngArrayList và viết chương trình dạng Menu

Thuộc website Harveymomstudy.com

Trả lời

Email của bạn sẽ không được hiển thị công khai.