Immutable ArrayList in Java

1. Overview

This quick tutorial will show how to make an ArrayList immutable with the core JDK, with Guava and finally with Apache Commons Collections 4.

This article is part of the “Java – Back to Basic” series here on Viet’s Blog.

2. With the JDK

First, the JDK provides a nice way to get an unmodifiable collection out of an existing one:

Collections.unmodifiableList(list);

The new collection should no longer be modifiable at this point:

@Test(expected = UnsupportedOperationException.class)
public void givenUsingTheJdk_whenUnmodifiableListIsCreated_thenNotModifiable() {
    List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
    List<String> unmodifiableList = Collections.unmodifiableList(list);
    unmodifiableList.add("four");
}

2.1. With Java 9

Since Java 9, we can use a List<E>.of​(E… elements) static factory method to create an immutable list:

@Test(expected = UnsupportedOperationException.class)
public final void givenUsingTheJava9_whenUnmodifiableListIsCreated_thenNotModifiable() {
    final List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
    final List<String> unmodifiableList = List.of(list.toArray(new String[]{}));
    unmodifiableList.add("four");
}

Notice how we have to convert the existing list into an array. This is because List.of(elements) accepts vararg parameters.

3. With Guava

Guava provides similar functionality for creating its own version of ImmutableList:

ImmutableList.copyOf(list);

Similarly – the resulting list should not be modifiable:

@Test(expected = UnsupportedOperationException.class)
public void givenUsingGuava_whenUnmodifiableListIsCreated_thenNotModifiable() {
    List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
    List<String> unmodifiableList = ImmutableList.copyOf(list);
    unmodifiableList.add("four");
}

Note that this operation will actually create a copy of the original list, not just a view.

Guava also provides a builder – this will return the strong-typed ImmutableList instead of simply List:

@Test(expected = UnsupportedOperationException.class)
public void givenUsingGuavaBuilder_whenUnmodifiableListIsCreated_thenNoLongerModifiable() {
    List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
    ImmutableList<String> unmodifiableList = ImmutableList.<String>builder().addAll(list).build();
    unmodifiableList.add("four");
}

4. With the Apache Collections Commons

Finally, Commons Collection also provides an API to create an unmodifiable list:

ListUtils.unmodifiableList(list);

And again, modifying the resulting list should result in an UnsupportedOperationException:

@Test(expected = UnsupportedOperationException.class)
public void givenUsingCommonsCollections_whenUnmodifiableListIsCreated_thenNotModifiable() {
    List<String> list = new ArrayList<>(Arrays.asList("one", "two", "three"));
    List<String> unmodifiableList = ListUtils.unmodifiableList(list);
    unmodifiableList.add("four");
}

5. Conclusion

This tutorial illustrates how to easily create an unmodifiable List out of an existing ArrayList using either the core JDK, Google Guava or Apache Commons Collections.

The implementation of all these examples and code snippets can be found over on Github – this is a Maven-based project, so it should be easy to import and run as it is.

Related posts:

Exploring the New Spring Cloud Gateway
Java Program to Implement Bubble Sort
Spring Security Authentication Provider
Java Program to Find Shortest Path Between All Vertices Using Floyd-Warshall’s Algorithm
How to Read HTTP Headers in Spring REST Controllers
Hướng dẫn Java Design Pattern – Intercepting Filter
Lớp LinkedHashMap trong Java
Create a Custom Exception in Java
Java Program to Implement Interpolation Search Algorithm
Check If Two Lists are Equal in Java
Guide to CountDownLatch in Java
Java Program to Use Above Below Primitive to Test Whether Two Lines Intersect
Hướng dẫn kết nối cơ sở dữ liệu với Java JDBC
Java Program to Implement Min Hash
Java Program to Solve a Matching Problem for a Given Specific Case
Converting Iterator to List
Java Program to Find the Shortest Path Between Two Vertices Using Dijkstra’s Algorithm
Java Program to Implement Strassen Algorithm
Java Program to Implement PriorityBlockingQueue API
Spring Boot - Eureka Server
Explain about URL and HTTPS protocol
Guide to the Volatile Keyword in Java
Java Program to Implement Multi-Threaded Version of Binary Search Tree
Java Program to Implement LinkedBlockingDeque API
Java – InputStream to Reader
Java Program to Search Number Using Divide and Conquer with the Aid of Fibonacci Numbers
Java Program to Implement Coppersmith Freivald’s Algorithm
Apache Commons Collections BidiMap
A Guide to Java HashMap
Flattening Nested Collections in Java
Hướng dẫn Java Design Pattern – Transfer Object
Spring Boot - Thymeleaf