ArrayList in Java is used to store dynamically sized collection of elements. Contrary to Arrays that are fixed in size, an ArrayList grows its size automatically when new elements are added to it.
ArrayList is part of Javas collection framework and implements Javas List interface.
Following are few key points to note about ArrayList in Java -
An ArrayList is a re-sizable array, also called a dynamic array. It grows its size to accommodate new elements and shrinks the size when the elements are removed.
ArrayList internally uses an array to store the elements. Just like arrays, It allows you to retrieve the elements by their index.
Java ArrayList allows duplicate and null values.
Java ArrayList is an ordered collection. It maintains the insertion order of the elements.
You cannot create an ArrayList of primitive types like int, char etc. You need to use boxed types like Integer, Character, Boolean etc.
Java ArrayList is not synchronized. If multiple threads try to modify an ArrayList at the same time, then the final outcome will be non-deterministic. You must explicitly synchronize access to an ArrayList if multiple threads are gonna modify it.
Creating an ArrayList and adding new elements to it
This example shows:
- How to create an ArrayList using the ArrayList[] constructor.
- Add new elements to an ArrayList using the add[] method.
import java.util.ArrayList;
import java.util.List;
public class CreateArrayListExample {
public static void main[String[] args] {
// Creating an ArrayList of String
List 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]
Creating an ArrayList from another collection
This example shows:
How to create an ArrayList from another collection using the ArrayList[Collection c] constructor.
How to add all the elements from an existing collection to the new ArrayList using the addAll[] method.
import java.util.ArrayList;
import java.util.List;
public class CreateArrayListFromCollectionExample {
public static void main[String[] args] {
List 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 firstTenPrimeNumbers = new ArrayList[firstFivePrimeNumbers];
List 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]
Accessing elements from an ArrayList
This example shows:
- How to check if an ArrayList is empty using the isEmpty[] method.
- How to find the size of an ArrayList using the size[] method.
- How to access the element at a particular index in an ArrayList using the get[] method.
- How to modify the element at a particular index in an ArrayList using the set[] method.
import java.util.ArrayList;
import java.util.List;
public class AccessElementsFromArrayListExample {
public static void main[String[] args] {
List 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]
Removing elements from an ArrayList
This example shows:
How to remove the element at a given index in an ArrayList | remove[int index]
How to remove an element from an ArrayList | remove[Object o]
How to remove all the elements from an ArrayList that exist in a given collection | removeAll[]
How to remove all the elements matching a given predicate | removeIf[]
How to clear an ArrayList | clear[]
import java.util.ArrayList;
import java.util.List;
import java.util.function.Predicate;
public class RemoveElementsFromArrayListExample {
public static void main[String[] args] {
List 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 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[new Predicate[] {
@Override
public boolean test[String s] {
return s.startsWith["C"];
}
}];
/*
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[]: []
Iterating over an ArrayList
The following example shows how to iterate over an ArrayList using
- Java 8 forEach and lambda expression.
- iterator[].
- iterator[] and Java 8 forEachRemaining[] method.
- listIterator[].
- Simple for-each loop.
- for loop with index.
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 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 tvShowIterator = tvShows.iterator[];
while [tvShowIterator.hasNext[]] {
String tvShow = tvShowIterator.next[];
System.out.println[tvShow];
}
System.out.println["\n=== Iterate using an iterator[] and Java 8 forEachRemaining[] method ==="];
tvShowIterator = tvShows.iterator[];
tvShowIterator.forEachRemaining[tvShow -> {
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 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 {
System.out.println["Name : " + user.getName[] + ", Age : " + user.getAge[]];
}];
}
}
# Output
Name : Rajeev, Age : 25
Name : John, Age : 34
Name : Steve, Age : 29
Sorting an ArrayList
Sorting an ArrayList is a very common task that you will encounter in your programs. In this section, Ill show you how to -
- Sort an ArrayList using Collections.sort[] method.
- Sort an ArrayList using ArrayList.sort[] method.
- Sort an ArrayList of user defined objects with a custom comparator.
1. Sort an ArrayList using Collections.sort[] method
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
public class ArrayListCollectionsSortExample {
public static void main[String[] args] {
List 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]
2. Sort an ArrayList using ArrayList.sort[] method
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
public class ArrayListSortExample {
public static void main[String[] args] {
List 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[] {
@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]
3. Sort an ArrayList of Objects using custom Comparator
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 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}]
Synchronizing Access to an ArrayList
The ArrayList class is not synchronized. If multiple threads try to modify an ArrayList at the same time then the final result becomes not-deterministic because one thread might override the changes done by another thread.
Example Demonstrating ArrayLists unpredictable behavior in multi-threaded environments
The following example shows what happens when multiple threads try to modify an ArrayList at the same time.
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
public class UnsafeArrayListExample {
public static void main[String[] args
] throws InterruptedException {
List unsafeArrayList
= new ArrayList[];
unsafeArrayList
.add[1];
unsafeArrayList
.add[2];
unsafeArrayList
.add[3];
// Create a thread pool of size 10
ExecutorService executorService
= Executors.newFixedThreadPool[10];
// Create a Runnable task that increments each element of the ArrayList by one
Runnable task
= [] -> {
incrementArrayList[unsafeArrayList
];
};
// Submit the task to the executor service 100 times.
// All the tasks will modify the ArrayList concurrently
for[int i
= 0; i