Ở bài viết trước thì chúng ta đã biết sơ qua về collection, đã phần nào hình dùng collection là gì, và biết cách thao tác cơ bản với chúng. Thì ở các bài viết sau của seri java collection thì mình sẽ cùng đi sâu hơn về các collection để xem cách thức chúng hoạt động, lưu trữ và xử lý dữ liệu của chúng như nào. Đặc điểm của từng collection, ưu và nhước điểm của từng loại để có thể áp dụng chúng vào các bài toàn thực tế một cách phù hợp nhất.
Thì bài hôm nay mình sẽ cùng tìm hiểu về ArrayList. Nhắc lại bài trước một xíu, nếu ai quên hoặc chưa đọc thì có thể ấn vào đây để có thể xem và nhớ lại những kiến thức mình đã giới thiệu ở bài trước. Ở bài trước mình có nói qua về Array, và Array không phải là 1 collection nhé. Vậy giữa Array và ArrayList có gì giống và khác nhau. Nghe tên đã thấy có gì giống với khác nhau rồi đúng không 😀
Mỗi một đặc điểm thì mình sẽ cố gắng đưa vào những ví dụ cụ thể nhất để mọi người dễ hình dung.
Thì điểm khác nhau đầu tiên giữa Array và ArrayList đó là
+ Array : Kích thước cố định.
+ ArrayList : Kích thước có thể thay đổi được.
nào xem ví dụ nhé.

Vậy là mình đã thực hiện khởi tạo 1 array với số lượng phần tử là 4. Và sau 2 vòng for thì mình đã add 4 phần tử vào trong array và đọc chúng ra. Như mình nói nói bên trên thì array là 1 mảng cố định số lượng phần tử, vậy sẽ như thế nào nếu mình add thêm 1 phần tử thứ 5 vào array bên trên.

sau khi mình tăng vòng for lên 1 thì lúc này vòng for chạy đến 5 tức là bằng độ dài ban đầu của mảng + 1.
Ngay lập tức trình duyệt báo lỗi “java.lang.ArrayIndexOutOfBoundsException”.
Vậy khi add thì như vậy còn nếu đọc số lượng phần tử lớn hơn mảng thì sao.

Nó vẫn sẽ đọc được 4 phần tử đầu nhưng đến phần tử thứ 5 sẽ bị lỗi vì không tìm thấy. Đây cũng chính là 1 nguyên nhân dẫn đến việc bị nullpointerexception trong java.
Để có thể đưa ra kết luận đầu tiên thì chúng ta đến với ví dụ về ArrayList nhé xem nó khắc phục vấn đề trên như thế nào.

Như mọi người thấy thì mình không hề khai báo số lượng phần tử, và việc thêm lẫn đọc dữ liệu của arraylist rất đơn giản. Để biết được tại sao arraylist lại làm được như vậy thì chúng ta tìm hiểu sâu hơn bên trong xem thư viện nó xử lý vấn đề quản lý kích thước mảng của arraylist như thế nào.

nôm na là khi bạn add phần từ đầu vào mảng thì lúc này mảng sẽ có kích thước mặc định là 10, và khi kích thước của mảng đạt tới 10 rồi thì nó sẽ tiếp tục tăng kích thước lên cho tới giá trị là “Integer.MAX_VALUE – 8;”

1 trích dẫn nho nhỏ là để có thể tìm hiểu sâu hơn thì bạn có thể ấn vào xem thư viện hoặc đọc doc của nó để biết cách thức nó xử lý như thế nào. Cảm ơn anh Tùng đã chỉ cho em kĩ năng này, mặc dù nó vẫn ở mức độ quèn 😀
Tiếp đến với sự khác nhau thứ 2:
Array : Có thể lưu trữ dữ liệu kiểu nguyên thủy và String
ArrayList : Chỉ có thể lưu trữ dữ liệu kiểu đối tượng. Kể từ Java 5, kiểu nguyên thủy được tự động chuyển đổi trong các đối tượng được gọi là auto-boxing.

Sự khác nhau thứ 3 :
Array : Chỉ có thuộc tính length.
ArrayList: Có nhiều phương thức để thao tác với dữ liệu.

còn với arrayList

Và sự khác nhau nữa đó là:
Array : Tốc độ lưu trữ và thao tác nhanh hơn.
ArrayList : Tốc độ lưu trữ vào thao tác chậm hơn.
Mình sẽ làm 1 ví dụ đo thời gian để add 100.000.000 phần tử vào mảng.

Đây là thời gian để add 100tr phần tử vào mảng, mất tận 42901 minisecon tức gần 43 giây.

Còn đây là với Array, con số nhanh hơn đáng kinh ngạc đúng không ạ. Cấu hình máy mình tương đối mạnh. Mọi người thử chạy xem hết bao nhiêu giây nhé.
Và vì sao ArrayList lại chậm hơn rất nhiều so với Array. Bản chất cả 2 cái đều có đặc điểm chung là các phần tử được lưu trữ ở địa chỉ liên tục nhau trong ô nhớ. Nhưng Array cần phải khởi tạo số lượng phần tử trước còn ArrayList sẽ tự động tặng kích thước mảng lên theo số lượng phần tử được add vào.
Như bên trên mình đã nói là mặc định khởi tạo ArrayList sẽ có kích thước mảng là 10. Chính vì vậy mà phía trên mình đã add 100tr phần tử vào mảng.
Khi insert 1 phần tử vào ArrayList, trường hợp tốt nhất thì ArrayList chỉ cần cập nhật index cho phần tử được thêm vào. Trường hợp xấu là ArrayList không đủ vùng nhớ (mặc định là chứa được 10 phần tử), trình xử lý phải copy toàn bộ các element sang một vùng nhớ khác lớn hơn (x1.5 lần) chính điều này làm cho tốc độ insert của ArrayList chậm hơn rất nhiều so với Array.
Tương tự với việc xóa 1 phần tử trong ArrayList. Độ phức tạp là giống với việc insert nên nó có độ phức tạp là O(n).
À bổ xung thêm 1 điểm khác nhau nho nhỏ nữa là để duyệt Array thì ta chỉ có thể dùng for. Nhưng với ArrayList là 1 collection nên chúng ta có thể dùng iterator để duyệt.
Qua những ví dụ trên thì chắc các bạn cũng bắt đầu hiểu được phần nào về ArrayList, cách nó lưu trữ dữ liệu, và các thao tác cơ bản với ArrayList.
Vì ArrayList là 1 thực thể của List nên nó sẽ có rất nhiều các phương thức để thao tác với nó. Mình sẽ liệt kê những phương thức và tác dụng của nó.

Các Ví dụ ArrayList trong Java
Khởi tạo một ArrayList
Để khai báo một ArrayList, chúng ta cần phải import gói thư viện java.util.ArrayList của Java. Cú pháp import như sau:

Ngoài ra, nếu chúng ta đã biết trước số lượng phần tử thì chúng ta có thể khai báo kèm với số lượng phần tử của nó. Ví dụ dưới đây sẽ khai báo một ArrayList có kiểu String và có 20 phần tử:

Hiển thị các phần tử có trong ArrayList
Để hiển thị các phần tử có trong ArrayList, chúng ta có các cách như sau:
Hiển thị theo tên của ArrayList.

Duyệt các phần tử của ArrayList – sử dụng vòng lặp for

Duyệt các phần tử của ArrayList – sử dụng vòng lặp foreach

Duyệt các phần tử của ArrayList – sử dụng Iterator.
Để sử dụng được Iterator chúng ta cần phải import gói thư viện java.util.Iterator của Java.

Duyệt các phần tử của ArrayList – sử dụng ListIterator.
Vì ArrayList là một lớp triển khai của List Interface nên nó cũng có thể sử dụng ListIterator để duyệt qua các phần tử của nó. Để sử dụng được ListIterator chúng ta cần phải import gói thư viện java.util.ListIterator của Java.

Các phương thức addAll(), removeAll(), retainAll() của lớp ArrayList
Ví dụ sau minh họa cách sử dụng các phương thức addAll(), removeAll(), retainAll() của lớp ArrayList trong Java:

Kết quả :

Truy cập phần tử của ArrayList
Java cung cấp cho chúng ta phương thức get() để truy cập đến 1 phần tử bất kỳ trong ArrayList thông qua chỉ số của phần tử đó. Chỉ số của ArrayList trong Java bắt đầu từ 0.

Cập nhật giá trị của phần tử Arraylist
Để cập nhật giá trị của phần tử trong ArrayList, Java cung cấp cho chúng ta phương thức set(index, element), trong đó index là chỉ số của phần tử cần cập nhật và element là phần tử mới để thay thế.

Xóa phần tử ArrayList
Để xóa phần tử trong ArrayList, Java cung cấp cho chúng ta 2 phương thức có sẵn đó là phương thức clear() và phương thức remove().
Phương thức clear()
Phương thức clear() sẽ xóa tất cả các phần tử có trong ArrayList. Sau đây là ví dụ minh họa phương thức này.

Phương thức remove()
Phương thức remove() sẽ xóa phần tử ra khỏi ArrayList theo 2 cách đó là xóa dựa vào chỉ số của phần tử và xóa trực tiếp phần tử đó (không cần biết đến chỉ số của nó). Ví dụ dưới đây sẽ minh họa 2 cách xóa này:

Tìm kiếm một phần tử ArrayList
Để tìm kiếm một phần tử trong ArrayList thì chúng ta có 3 phương pháp tìm kiếm như sau:
Tìm kiếm trực tiếp phần tử.
Để tìm kiếm trực tiếp phần tử, chúng ta sẽ sử dụng phương thức contains() . Kết quả trả về là true nếu tìm thấy, ngược lại trả về false.

Tìm kiếm vị trí xuất hiện đầu tiên của 1 phần tử trong ArrayList.
Để tìm kiếm vị trí xuất hiện đầu tiên của 1 phần tử trong ArrayList, chúng ta sẽ sừ dụng phương thức indexOf(). Kết quả của phương thức này sẽ trả về chỉ số xuất hiện đầu tiên của phần tử đó trong ArrayList, ngược lại nếu không tìm thấy trả về -1.

Tìm kiếm vị trí xuất hiện cuối cùng của 1 phần tử trong List.
Để tìm kiếm vị trí xuất hiện cuối cùng của 1 phần tử trong ArrayList, chúng ta sẽ sừ dụng phương thức lastIndexOf(). Kết quả của phương thức này sẽ trả về chỉ số xuất hiện cuối cùng của phần tử đó trong ArrayList, ngược lại nếu không tìm thấy trả về -1.

Chuyển ArrayList sang mảng (Array) trong Java
Phương thức toArray() trong Java được dùng để chuyển đổi một ArrayList sang mảng tương ứng. Sau đây là ví dụ minh họa phương thức này:

Tạo ArrayList có kiểu generic là String

Tạo ArrayList có kiểu generic là đối tượng do người dùng định nghĩa

Vậy qua bài học hôm nay thì bạn đã biết được ArrayList là gì, các xử lý và thao tác với ArrayList. Vì kiến thức còn hạn hẹp nên có gì sai xót thì mọi người comment góp ý để các bài viết sau tốt hơn. Cảm ơn mọi người ❤
nguồn tham khảo : https://docs.oracle.com/javase/8/docs/api/java/util/ArrayList.html
oke bạn nha
ThíchThích