ArrayList trong Java được sử dụng để lưu trữ bộ sưu tập các phần tử có kích thước động.
Trái ngược với Mảng được cố định về kích thước, một ArrayList tự động tăng kích thước của nó khi các phần tử mới được thêm vào nó.
ArrayList là một phần của Collection Framework của Java và thực hiện
List
interface
của Java
.
Sau đây là một vài điểm chính cần lưu ý về ArrayList trong Java –
-
Một ArrayList là một mảng có thể resize, còn được gọi là một mảng động.
Nó tăng kích thước của nó để chứa các phần tử mới và thu nhỏ kích thước khi các phần tử được loại bỏ.
-
ArrayList bên trong sử dụng một mảng để lưu trữ các phần tử.
Giống như mảng, Nó cho phép bạn lấy các phần tử theo chỉ mục của chúng.
-
Java ArrayList cho phép các giá trị trùng lặp và null.
-
Java ArrayList là một collection theo thứ tự.
Nó duy trì thứ tự chèn của các phần tử.
-
Bạn không thể tạo một ArrayList với loại dữ liệu nguyên thủy như
int
,
char
Bạn cần phải sử dụng các các kiểu dữ liệu tham chiếu như
Integer
,
Character
,
Boolean
,
Tóm Tắt
1. Tạo một ArrayList và thêm các phần tử mới cho nó
Ví dụ này cho thấy:
-
Cách tạo một ArrayList bằng cách sử dụng constructor
ArrayList()
để khởi tạo.
-
Thêm các phần tử mới vào một ArrayList bằng phương thức
add()
.
import
java
.
util
.
ArrayList
;
import
java
.
util
.
List
;
public
class
CreateArrayListExample
{
public
static
void
main
(
String
[
]
args
)
{
// Creating an ArrayList of String
List
<
String
>
animals
=
new
ArrayList
<
>
(
)
;
// Adding new elements to the ArrayList
animals
.
add
(
“Lion”
)
;
animals
.
add
(
“Tiger”
)
;
animals
.
add
(
“Cat”
)
;
animals
.
add
(
“Dog”
)
;
System
.
out
.
println
(
animals
)
;
// Adding an element at a particular index in an ArrayList
animals
.
add
(
2
,
“Elephant”
)
;
System
.
out
.
println
(
animals
)
;
}
}
# Output
[
Lion, Tiger, Cat, Dog
]
[
Lion, Tiger, Elephant, Cat, Dog
]
2. Tạo một ArrayList từ Collection khác
Ví dụ này cho thấy:
-
Cách tạo ArrayList từ collectionkhác bằng cách sử dụng hàm
ArrayList(Collection c)
tạo.
-
Cách thêm tất cả các phần tử từ một collectionhiện có vào ArrayList mới bằng
addAll()
phương thức.
import
java
.
util
.
ArrayList
;
import
java
.
util
.
List
;
public
class
CreateArrayListFromCollectionExample
{
public
static
void
main
(
String
[
]
args
)
{
List
<
Integer
>
firstFivePrimeNumbers
=
new
ArrayList
<
>
(
)
;
firstFivePrimeNumbers
.
add
(
2
)
;
firstFivePrimeNumbers
.
add
(
3
)
;
firstFivePrimeNumbers
.
add
(
5
)
;
firstFivePrimeNumbers
.
add
(
7
)
;
firstFivePrimeNumbers
.
add
(
11
)
;
// Creating an ArrayList from another collection
List
<
Integer
>
firstTenPrimeNumbers
=
new
ArrayList
<
>
(
firstFivePrimeNumbers
)
;
List
<
Integer
>
nextFivePrimeNumbers
=
new
ArrayList
<
>
(
)
;
nextFivePrimeNumbers
.
add
(
13
)
;
nextFivePrimeNumbers
.
add
(
17
)
;
nextFivePrimeNumbers
.
add
(
19
)
;
nextFivePrimeNumbers
.
add
(
23
)
;
nextFivePrimeNumbers
.
add
(
29
)
;
// Adding an entire collection to an ArrayList
firstTenPrimeNumbers
.
addAll
(
nextFivePrimeNumbers
)
;
System
.
out
.
println
(
firstTenPrimeNumbers
)
;
}
}
# Output
[
2
,
3
,
5
,
7
,
11
,
13
,
17
,
19
,
23
,
29
]
3. Truy cập các phần tử từ một ArrayList
Ví dụ này cho thấy:
-
Làm thế nào để kiểm tra nếu một ArrayList trống bằng cách sử dụng
isEmpty()
phương thức.
-
Cách tìm kích thước của một ArrayList bằng
size()
phương thức.
-
Cách truy cập phần tử tại một chỉ mục cụ thể trong ArrayList bằng
get()
phương thức.
-
Cách sửa đổi phần tử tại một chỉ mục cụ thể trong ArrayList bằng
set()
phương thức.
import
java
.
util
.
ArrayList
;
import
java
.
util
.
List
;
public
class
AccessElementsFromArrayListExample
{
public
static
void
main
(
String
[
]
args
)
{
List
<
String
>
topCompanies
=
new
ArrayList
<
>
(
)
;
// Check if an ArrayList is empty
System
.
out
.
println
(
“Is the topCompanies list empty? : “
+
topCompanies
.
isEmpty
(
)
)
;
topCompanies
.
add
(
“Google”
)
;
topCompanies
.
add
(
“Apple”
)
;
topCompanies
.
add
(
“Microsoft”
)
;
topCompanies
.
add
(
“Amazon”
)
;
topCompanies
.
add
(
“Facebook”
)
;
// Find the size of an ArrayList
System
.
out
.
println
(
“Here are the top “
+
topCompanies
.
size
(
)
+
” companies in the world”
)
;
System
.
out
.
println
(
topCompanies
)
;
// Retrieve the element at a given index
String
bestCompany
=
topCompanies
.
get
(
0
)
;
String
secondBestCompany
=
topCompanies
.
get
(
1
)
;
String
lastCompany
=
topCompanies
.
get
(
topCompanies
.
size
(
)
–
1
)
;
System
.
out
.
println
(
“Best Company: “
+
bestCompany
)
;
System
.
out
.
println
(
“Second Best Company: “
+
secondBestCompany
)
;
System
.
out
.
println
(
“Last Company in the list: “
+
lastCompany
)
;
// Modify the element at a given index
topCompanies
.
set
(
4
,
“Walmart”
)
;
System
.
out
.
println
(
“Modified top companies list: “
+
topCompanies
)
;
}
}
# Output
Is the topCompanies list empty?
:
true
Here are the
top
5
companies
in
the world
[
Google, Apple, Microsoft, Amazon, Facebook
]
Best Company: Google
Second Best Company: Apple
Last Company
in
the list: Facebook
Modified
top
companies list:
[
Google, Apple, Microsoft, Amazon, Walmart
]
4. Xóa các phần tử khỏi một ArrayList
Ví dụ này cho thấy:
-
Cách loại bỏ phần tử tại một chỉ mục đã cho trong ArrayList |
remove(int index)
-
Cách xóa phần tử khỏi ArrayList |
remove(Object o)
-
Cách xóa tất cả các thành phần khỏi ArrayList tồn tại trong một collectionđã cho |
removeAll()
-
Làm thế nào để xóa bỏ các phần tử thỏa mãn một điều kiện nào đó|
removeIf ()
-
Làm thế nào để xóa một ArrayList |
clear()
import
java
.
util
.
ArrayList
;
import
java
.
util
.
List
;
public
class
RemoveElementsFromArrayListExample
{
public
static
void
main
(
String
[
]
args
)
{
List
<
String
>
programmingLanguages
=
new
ArrayList
<
>
(
)
;
programmingLanguages
.
add
(
“C”
)
;
programmingLanguages
.
add
(
“C++”
)
;
programmingLanguages
.
add
(
“Java”
)
;
programmingLanguages
.
add
(
“Kotlin”
)
;
programmingLanguages
.
add
(
“Python”
)
;
programmingLanguages
.
add
(
“Perl”
)
;
programmingLanguages
.
add
(
“Ruby”
)
;
System
.
out
.
println
(
“Initial List: “
+
programmingLanguages
)
;
// Remove the element at index `5`
programmingLanguages
.
remove
(
5
)
;
System
.
out
.
println
(
“After remove(5): “
+
programmingLanguages
)
;
// Remove the first occurrence of the given element from the ArrayList
// (The remove() method returns false if the element does not exist in the ArrayList)
boolean
isRemoved
=
programmingLanguages
.
remove
(
“Kotlin”
)
;
System
.
out
.
println
(
“After remove(\”Kotlin\”): “
+
programmingLanguages
)
;
// Remove all the elements that exist in a given collection
List
<
String
>
scriptingLanguages
=
new
ArrayList
<
>
(
)
;
scriptingLanguages
.
add
(
“Python”
)
;
scriptingLanguages
.
add
(
“Ruby”
)
;
scriptingLanguages
.
add
(
“Perl”
)
;
programmingLanguages
.
removeAll
(
scriptingLanguages
)
;
System
.
out
.
println
(
“After removeAll(scriptingLanguages): “
+
programmingLanguages
)
;
// Remove all the elements that satisfy the given predicate
programmingLanguages
.
removeIf
(n -> (n.charAt(0) == ‘T’));
/*
The above removeIf() call can also be written using lambda expression like this –
programmingLanguages.removeIf(s -> s.startsWith(“C”))
*/
System
.
out
.
println
(
“After Removing all elements that start with \”C\”: “
+
programmingLanguages
)
;
// Remove all elements from the ArrayList
programmingLanguages
.
clear
(
)
;
System
.
out
.
println
(
“After clear(): “
+
programmingLanguages
)
;
}
}
# Output
Initial List:
[
C, C++, Java, Kotlin, Python, Perl, Ruby
]
After remove
(
5
)
:
[
C, C++, Java, Kotlin, Python, Ruby
]
After remove
(
“Kotlin”
)
:
[
C, C++, Java, Python, Ruby
]
After removeAll
(
scriptingLanguages
)
:
[
C, C++, Java
]
After Removing all elements that start with
“C”
:
[
Java
]
After clear
(
)
:
[
]
5. Duyệt qua các phần tử trong ArrayList
Ví dụ sau đây cho thấy cách duyệt qua ArrayList bằng cách sử dụng
- forEach
và biểu thức lambda.
- iterator()
.
- listIterator()
.
-
Vòng lặp for-each
-
Vòng lặp với chỉ số
import
java
.
util
.
ArrayList
;
import
java
.
util
.
Iterator
;
import
java
.
util
.
List
;
import
java
.
util
.
ListIterator
;
public
class
IterateOverArrayListExample
{
public
static
void
main
(
String
[
]
args
)
{
List
<
String
>
tvShows
=
new
ArrayList
<
>
(
)
;
tvShows
.
add
(
“Breaking Bad”
)
;
tvShows
.
add
(
“Game Of Thrones”
)
;
tvShows
.
add
(
“Friends”
)
;
tvShows
.
add
(
“Prison break”
)
;
System
.
out
.
println
(
“=== Iterate using Java 8 forEach and lambda ===”
)
;
tvShows
.
forEach
(
tvShow
->
{
System
.
out
.
println
(
tvShow
)
;
}
)
;
System
.
out
.
println
(
“\n=== Iterate using an iterator() ===”
)
;
Iterator
<
String
>
tvShowIterator
=
tvShows
.
iterator
(
)
;
while
(
tvShowIterator
.
hasNext
(
)
)
{
String
tvShow
=
tvShowIterator
.
next
(
)
;
System
.
out
.
println
(
tvShow
)
;
}
System
.
out
.
println
(
“\n=== Iterate using a listIterator() to traverse in both directions ===”
)
;
// Here, we start from the end of the list and traverse backwards.
ListIterator
<
String
>
tvShowListIterator
=
tvShows
.
listIterator
(
tvShows
.
size
(
)
)
;
while
(
tvShowListIterator
.
hasPrevious
(
)
)
{
String
tvShow
=
tvShowListIterator
.
previous
(
)
;
System
.
out
.
println
(
tvShow
)
;
}
System
.
out
.
println
(
“\n=== Iterate using simple for-each loop ===”
)
;
for
(
String
tvShow
:
tvShows
)
{
System
.
out
.
println
(
tvShow
)
;
}
System
.
out
.
println
(
“\n=== Iterate using for loop with index ===”
)
;
for
(
int
i
=
0
;
i
<
tvShows
.
size
(
)
;
i
++
)
{
System
.
out
.
println
(
tvShows
.
get
(
i
)
)
;
}
}
}
# Output
==
=
Iterate using Java
8
forEach and lambda
==
=
Breaking Bad
Game Of Thrones
Friends
Prison
break
==
=
Iterate using an iterator
(
)
==
=
Breaking Bad
Game Of Thrones
Friends
Prison
break
==
=
Iterate using a listIterator
(
)
to traverse
in
both directions
==
=
Prison
break
Friends
Game Of Thrones
Breaking Bad
==
=
Iterate using simple for-each loop
==
=
Breaking Bad
Game Of Thrones
Friends
Prison
break
==
=
Iterate using
for
loop with index
==
=
Breaking Bad
Game Of Thrones
Friends
Prison
break
Các
phương thức
iterator()
và
listIterator()
hữu ích khi bạn cần sửa đổi ArrayList trong khi duyệt qua các phần tử.
Hãy xem xét ví dụ sau, trong đó chúng ta sẽ loại bỏ các phần tử khỏi ArrayList bằng cách sử dụng phương thức
iterator.remove()
trong khi duyệt qua nó:
import
java
.
util
.
ArrayList
;
import
java
.
util
.
Iterator
;
import
java
.
util
.
List
;
public
class
ArrayListIteratorRemoveExample
{
public
static
void
main
(
String
[
]
args
)
{
List
<
Integer
>
numbers
=
new
ArrayList
<
>
(
)
;
numbers
.
add
(
13
)
;
numbers
.
add
(
18
)
;
numbers
.
add
(
25
)
;
numbers
.
add
(
40
)
;
Iterator
<
Integer
>
numbersIterator
=
numbers
.
iterator
(
)
;
while
(
numbersIterator
.
hasNext
(
)
)
{
Integer
num
=
numbersIterator
.
next
(
)
;
if
(
num
%
2
!=
0
)
{
numbersIterator
.
remove
(
)
;
}
}
System
.
out
.
println
(
numbers
)
;
}
}
# Output
[
18
,
40
]
6. Tìm kiếm các phần tử trong một ArrayList
Ví dụ dưới đây cho thấy cách:
-
Kiểm tra xem một ArrayList có chứa một phần tử đã cho không |
contains()
-
Tìm chỉ mục của lần xuất hiện đầu tiên của một phần tử trong ArrayList |
indexOf()
-
Tìm chỉ mục của lần xuất hiện cuối cùng của một phần tử trong ArrayList |
lastIndexOf ()
import
java
.
util
.
ArrayList
;
import
java
.
util
.
List
;
public
class
SearchElementsInArrayListExample
{
public
static
void
main
(
String
[
]
args
)
{
List
<
String
>
names
=
new
ArrayList
<
>
(
)
;
names
.
add
(
“John”
)
;
names
.
add
(
“Alice”
)
;
names
.
add
(
“Bob”
)
;
names
.
add
(
“Steve”
)
;
names
.
add
(
“John”
)
;
names
.
add
(
“Steve”
)
;
names
.
add
(
“Maria”
)
;
// Check if an ArrayList contains a given element
System
.
out
.
println
(
“Does names array contain \”Bob\”? : “
+
names
.
contains
(
“Bob”
)
)
;
// Find the index of the first occurrence of an element in an ArrayList
System
.
out
.
println
(
“indexOf \”Steve\”: “
+
names
.
indexOf
(
“Steve”
)
)
;
System
.
out
.
println
(
“indexOf \”Mark\”: “
+
names
.
indexOf
(
“Mark”
)
)
;
// Find the index of the last occurrence of an element in an ArrayList
System
.
out
.
println
(
“lastIndexOf \”John\” : “
+
names
.
lastIndexOf
(
“John”
)
)
;
System
.
out
.
println
(
“lastIndexOf \”Bill\” : “
+
names
.
lastIndexOf
(
“Bill”
)
)
;
}
}
# Output
Does names array contain
“Bob”
?
:
true
indexOf
“Steve”
:
3
indexOf
“Mark”
:
-1
lastIndexOf
“John”
:
4
lastIndexOf
“Bill”
:
-1
7. ArrayList của các đối tượng do người dùng định nghĩa
Vì ArrayList hỗ trợ generic, bạn có thể tạo ArrayList thuộc
bất kỳ
loại
nào
.
Nó có thể là các loại đơn giản như thế
Integer
,
String
,
Double
hoặc các loại phức tạp như một ArrayList của ArrayLists, hoặc một ArrayList của HashMaps hoặc một ArrayList của bất kỳ người dùng định nghĩa các đối tượng.
Trong ví dụ sau, bạn sẽ tìm hiểu cách tạo ArrayList của các đối tượng do người dùng xác định.
import
java
.
util
.
ArrayList
;
import
java
.
util
.
List
;
class
User
{
private
String
name
;
private
int
age
;
public
User
(
String
name
,
int
age
)
{
this
.
name
=
name
;
this
.
age
=
age
;
}
public
String
getName
(
)
{
return
name
;
}
public
void
setName
(
String
name
)
{
this
.
name
=
name
;
}
public
int
getAge
(
)
{
return
age
;
}
public
void
setAge
(
int
age
)
{
this
.
age
=
age
;
}
}
public
class
ArrayListUserDefinedObjectExample
{
public
static
void
main
(
String
[
]
args
)
{
List
<
User
>
users
=
new
ArrayList
<
>
(
)
;
users
.
add
(
new
User
(
“Rajeev”
,
25
)
)
;
users
.
add
(
new
User
(
“John”
,
34
)
)
;
users
.
add
(
new
User
(
“Steve”
,
29
)
)
;
users
.
forEach
(
user
->
{
System
.
out
.
println
(
“Name : “
+
user
.
getName
(
)
+
“, Age : “
+
user
.
getAge
(
)
)
;
}
)
;
}
}
# Output
Name
:
Rajeev, Age
:
25
Name
:
John, Age
:
34
Name
:
Steve, Age
:
29
8. Sắp xếp một ArrayList
Sắp xếp một ArrayList là một nhiệm vụ rất phổ biến mà bạn sẽ gặp trong các chương trình của mình.
Trong phần này, tôi sẽ chỉ cho bạn cách –
-
Sắp xếp một ArrayList bằng
Collections.sort()
phương thức.
-
Sắp xếp một ArrayList bằng
ArrayList.sort()
phương thức.
-
Sắp xếp một ArrayList của các đối tượng do người dùng xác định bằng một bộ so sánh tùy chỉnh.
8.1. Sắp xếp một ArrayList bằng phương thức Collections.sort ()
import
java
.
util
.
ArrayList
;
import
java
.
util
.
Collections
;
import
java
.
util
.
List
;
public
class
ArrayListCollectionsSortExample
{
public
static
void
main
(
String
[
]
args
)
{
List
<
Integer
>
numbers
=
new
ArrayList
<
>
(
)
;
numbers
.
add
(
13
)
;
numbers
.
add
(
7
)
;
numbers
.
add
(
18
)
;
numbers
.
add
(
5
)
;
numbers
.
add
(
2
)
;
System
.
out
.
println
(
“Before : “
+
numbers
)
;
// Sorting an ArrayList using Collections.sort() method
Collections
.
sort
(
numbers
)
;
System
.
out
.
println
(
“After : “
+
numbers
)
;
}
}
# Output
Before
:
[
13
,
7
,
18
,
5
,
2
]
After
:
[
2
,
5
,
7
,
13
,
18
]
8.2 Sắp xếp một ArrayList bằng phương thức ArrayList.sort ()
import
java
.
util
.
ArrayList
;
import
java
.
util
.
Comparator
;
import
java
.
util
.
List
;
public
class
ArrayListSortExample
{
public
static
void
main
(
String
[
]
args
)
{
List
<
String
>
names
=
new
ArrayList
<
>
(
)
;
names
.
add
(
“Lisa”
)
;
names
.
add
(
“Jennifer”
)
;
names
.
add
(
“Mark”
)
;
names
.
add
(
“David”
)
;
System
.
out
.
println
(
“Names : “
+
names
)
;
// Sort an ArrayList using its sort() method. You must pass a Comparator to the ArrayList.sort() method.
names
.
sort
(
new
Comparator
<
String
>
(
)
{
@Override
public
int
compare
(
String
name1
,
String
name2
)
{
return
name1
.
compareTo
(
name2
)
;
}
}
)
;
// The above `sort()` method call can also be written simply using lambda expression
names
.
sort
(
(
name1
,
name2
)
->
name1
.
compareTo
(
name2
)
)
;
// Following is an even more concise solution
names
.
sort
(
Comparator
.
naturalOrder
(
)
)
;
System
.
out
.
println
(
“Sorted Names : “
+
names
)
;
}
}
# Output
Names : [Lisa, Jennifer, Mark, David]
Sorted Names : [David, Jennifer, Lisa, Mark]
8.3 Sắp xếp một ArrayList của các đối tượng bằng cách sử dụng Trình so sánh tùy chỉnh
import
java
.
util
.
ArrayList
;
import
java
.
util
.
Collections
;
import
java
.
util
.
Comparator
;
import
java
.
util
.
List
;
class
Person
{
private
String
name
;
private
Integer
age
;
public
Person
(
String
name
,
Integer
age
)
{
this
.
name
=
name
;
this
.
age
=
age
;
}
public
String
getName
(
)
{
return
name
;
}
public
void
setName
(
String
name
)
{
this
.
name
=
name
;
}
public
Integer
getAge
(
)
{
return
age
;
}
public
void
setAge
(
Integer
age
)
{
this
.
age
=
age
;
}
@Override
public
String
toString
(
)
{
return
“{“
+
“name='”
+
name
+
‘\”
+
“, age=”
+
age
+
‘}’
;
}
}
public
class
ArrayListObjectSortExample
{
public
static
void
main
(
String
[
]
args
)
{
List
<
Person
>
people
=
new
ArrayList
<
>
(
)
;
people
.
add
(
new
Person
(
“Sachin”
,
47
)
)
;
people
.
add
(
new
Person
(
“Chris”
,
34
)
)
;
people
.
add
(
new
Person
(
“Rajeev”
,
25
)
)
;
people
.
add
(
new
Person
(
“David”
,
31
)
)
;
System
.
out
.
println
(
“Person List : “
+
people
)
;
// Sort People by their Age
people
.
sort
(
(
person1
,
person2
)
->
{
return
person1
.
getAge
(
)
–
person2
.
getAge
(
)
;
}
)
;
// A more concise way of writing the above sorting function
people
.
sort
(
Comparator
.
comparingInt
(
Person
:
:
getAge
)
)
;
System
.
out
.
println
(
“Sorted Person List by Age : “
+
people
)
;
// You can also sort using Collections.sort() method by passing the custom Comparator
Collections
.
sort
(
people
,
Comparator
.
comparing
(
Person
:
:
getName
)
)
;
System
.
out
.
println
(
“Sorted Person List by Name : “
+
people
)
;
}
}
# Output
Person List : [{name=’Sachin’, age=47}, {name=’Chris’, age=34}, {name=’Rajeev’, age=25}, {name=’David’, age=31}]
Sorted Person List by Age : [{name=’Rajeev’, age=25}, {name=’David’, age=31}, {name=’Chris’, age=34}, {name=’Sachin’, age=47}]
Sorted Person List by Name : [{name=’Chris’, age=34}, {name=’David’, age=31}, {name=’Rajeev’, age=25}, {name=’Sachin’, age=47}]
Phần kết luận
Đó là tất cả mọi thứ tôi chia sẻ về ArrayList trong Java.
Trong bài viết này, bạn đã tìm hiểu ArrayList là gì, cách tạo ArrayList, cách thêm, sửa đổi và xóa các phần tử khỏi ArrayList, cách lặp qua ArrayList, cách sắp xếp ArrayList và cách đồng bộ hóa quyền truy cập vào ArrayList .
Cảm ơn bạn đã đọc.
Hẹn gặp lại trong bài tiếp theo.