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:

Remove HTML tags from a file to extract only the TEXT
Serverless Functions with Spring Cloud Function
Hướng dẫn sử dụng Java String, StringBuffer và StringBuilder
Hướng dẫn sử dụng String Format trong Java
Spring Data JPA @Modifying Annotation
Spring Cloud Bus
Count Occurrences of a Char in a String
Java Program to Generate Randomized Sequence of Given Range of Numbers
Jackson Exceptions – Problems and Solutions
Java Program to Check if a Given Graph Contain Hamiltonian Cycle or Not
Spring REST API with Protocol Buffers
Hướng dẫn sử dụng luồng vào ra ký tự trong Java
Java Program to Generate Random Hexadecimal Byte
Check If a String Is Numeric in Java
A Guide to TreeMap in Java
Java Program to implement Associate Array
Guide to the Java ArrayList
Ignore Null Fields with Jackson
Java Program to Check if an UnDirected Graph is a Tree or Not Using DFS
Java Program to Find Basis and Dimension of a Matrix
Guide to Escaping Characters in Java RegExps
Java Program to implement Bi Directional Map
Java Program to Implement Dijkstra’s Algorithm using Priority Queue
Custom Thread Pools In Java 8 Parallel Streams
Generic Constructors in Java
Java Program to Construct K-D Tree for 2 Dimensional Data
Java Program to Find the Number of Ways to Write a Number as the Sum of Numbers Smaller than Itself
Java Program to Check Cycle in a Graph using Topological Sort
Java Program to Use Boruvka’s Algorithm to Find the Minimum Spanning Tree
@DynamicUpdate with Spring Data JPA
The “final” Keyword in Java
Loại bỏ các phần tử trùng trong một ArrayList như thế nào trong Java 8?