Expand Authors Top

If you have a few years of experience in the Java ecosystem and you’d like to share that with the community, have a look at our Contribution Guidelines.

November Discount Launch 2022 – Top
We’re finally running a Black Friday launch. All Courses are 30% off until next Friday:

>> GET ACCESS NOW

November Discount Launch 2022 – TEMP TOP (NPI)
We’re finally running a Black Friday launch. All Courses are 30% off until next Friday:

>> GET ACCESS NOW

Expanded Audience – Frontegg – Security (partner)
announcement - icon User management is very complex, when implemented properly. No surprise here.

Not having to roll all of that out manually, but instead integrating a mature, fully-fledged solution - yeah, that makes a lot of sense.
That's basically what Frontegg is - User Management for your application. It's focused on making your app scalable, secure and enjoyable for your users.
From signup to authentication, it supports simple scenarios all the way to complex and custom application logic.

Have a look:

>> Elegant User Management, Tailor-made for B2B SaaS

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 Baeldung.

Further reading:

Collect a Java Stream to an Immutable Collection

Learn how to collect Java Streams to immutable Collections.

Introduction to Immutables

A quick and practical intro to the Immutables library - used to generate immutable objects via the use of annotations.

Java – Get Random Item/Element From a List

A quick and practical guide to picking a random item/items from a List in Java.

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.

November Discount Launch 2022 – Bottom
We’re finally running a Black Friday launch. All Courses are 30% off until next Friday:

>> GET ACCESS NOW

Generic footer banner
Comments are closed on this article!