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:

HttpClient 4 Cookbook
Java Program to Find Whether a Path Exists Between 2 Given Nodes
Spring Boot - Service Components
Introduction to Spring Data JPA
Java Program to Implement LinkedBlockingQueue API
Giới thiệu Json Web Token (JWT)
HTTP Authentification and CGI/Servlet
Giới thiệu về Stream API trong Java 8
Java equals() and hashCode() Contracts
Java Program to Generate All Possible Combinations of a Given List of Numbers
Java Program to Implement Weight Balanced Tree
Hướng dẫn sử dụng Java String, StringBuffer và StringBuilder
Basic Authentication with the RestTemplate
Guide to the Java Queue Interface
Java Program to find the number of occurrences of a given number using Binary Search approach
Java Program to Implement Bresenham Line Algorithm
Build a REST API with Spring and Java Config
A Custom Data Binder in Spring MVC
Getting Started with GraphQL and Spring Boot
DistinctBy in the Java Stream API
Java Program to Encode a Message Using Playfair Cipher
Spring WebClient vs. RestTemplate
Đồng bộ hóa các luồng trong Java
Java Program to Implement Hash Tables chaining with Singly Linked Lists
Java Program to Find Minimum Number of Edges to Cut to make the Graph Disconnected
Tránh lỗi NullPointerException trong Java như thế nào?
Java Program to Implement Adjacency List
Java – Convert File to InputStream
Java Program to Implement Interval Tree
Java Program to Search Number Using Divide and Conquer with the Aid of Fibonacci Numbers
Java Program to Implement LinkedList API
Java Program to Use rand and srand Functions