Java中的不可变列表
- 顾名思义,ImmutableList 是一种不可变的 List。表示声明后List的内容是固定的或不变的,即只读。
- 如果尝试添加、删除和更新列表中的元素,则会引发UnsupportedOperationException 。
- ImmutableList 也不允许空元素。
- 如果尝试使用 null 元素创建 ImmutableList,则会引发NullPointerException 。如果尝试在 List 中添加 null 元素,则会引发UnsupportedOperationException 。
不可变列表的优点
- 它们是线程安全的。
- 它们具有内存效率。
- 由于它们是不可变的,因此它们可以毫无问题地传递给第三方库。
注意它是不可变集合,不是不可变对象的集合,所以里面的对象是可以修改的。
类声明:
@GwtCompatible(serializable=true,
emulated=true)
public abstract class ImmutableList
extends ImmutableCollection
implements List, RandomAccess
类层次结构:
java.lang.Object
↳ java.util.AbstractCollection
↳ com.google.common.collect.ImmutableCollection
↳ com.google.common.collect.ImmutableList
创建不可变列表
ImmutableList 可以通过各种方法创建。这些包括:
- 使用 Guava 的 copyOf()函数从现有列表中
// Below is the Java program to create ImmutableList import com.google.common.collect.ImmutableList; import java.util.*; class GFG { // Function to create ImmutableList from List public static
void iList(List list) { // Create ImmutableMap from Map using copyOf() ImmutableList immutableList = ImmutableList.copyOf(list); // Print the ImmutableMap System.out.println(immutableList); } public static void main(String[] args) { List list = new ArrayList<>( Arrays.asList("Geeks", "For", "Geeks")); iList(list); } } 输出:
[Geeks, For, Geeks]
- 使用来自 Guava 的 of()函数的新 ImmutableList
// Below is the Java program to create ImmutableList import com.google.common.collect.ImmutableList; import java.util.*; class GFG { // Function to create ImmutableList public static void iList() { // Create ImmutableList using of() ImmutableList
immutableList = ImmutableList.of("Geeks", "For", "Geeks"); // Print the ImmutableMap System.out.println(immutableList); } public static void main(String[] args) { iList(); } } 输出:
[Geeks, For, Geeks]
- 使用Java 9 Factory Of() 方法
在Java中,使用 of() 与 Set、Map 或 List 来创建不可变列表。
请注意:以下程序是Java 9 的。因此您需要Java 9 编译器来运行它们。
// Java code illustrating of() method to // create a ImmutableSet import java.util.*; import com.google.common.collect.ImmutableList; class GfG { public static void main(String args[]) { // non-empty immutable set List
list = List.of("Geeks", "For", "Geeks"); // Let's print the list System.out.println(list); } } 输出:
[Geeks, For, Geeks]
- 使用 ImmutableList 中的 Builder()
在 Guava 中,ImmnutableList 类提供了一个函数Builder()。通过这个函数,可以创建一个新的 ImmutableList,或者
ImmutableList 可以从现有 List 或两者中创建。- 创建一个新的 ImmutableList
// Java code illustrating of() method to // create a ImmutableList import java.util.*; import com.google.common.collect.ImmutableList; class GfG { public static void main(String args[]) { // non-empty immutable set ImmutableList
iList = ImmutableList. builder() .add("Geeks", "For", "Geeks") .build(); // Let's print the List System.out.println(iList); } } 输出:
[Geeks, For, Geeks]
- 从现有 List 创建一个 ImmutableList
// Java code illustrating of() method to // create a ImmutableList import java.util.*; import com.google.common.collect.ImmutableList; class GfG { public static void main(String args[]) { // non-empty immutable set List
list = List.of("Geeks", "For", "Geeks"); ImmutableList iList = ImmutableList. builder() .addAll(list) .build(); // Let's print the List System.out.println(iList); } } 输出:
[Geeks, For, Geeks]
- 创建一个包含现有列表的新 ImmutableList
// Java code illustrating of() method to // create a ImmutableList import java.util.*; import com.google.common.collect.ImmutableList; class GfG { public static void main(String args[]) { // non-empty immutable set List
list = List.of("Geeks", "For", "Geeks"); ImmutableList iList = ImmutableList. builder() .addAll(list) .add("Computer", "Portal", ) .build(); // Let's print the set System.out.println(iList); } } 输出:
[Geeks, For, Geeks, Computer, Portal]
- 创建一个新的 ImmutableList
尝试改变 ImmutableList
如前所述,以下程序将抛出UnsupportedOperationException 。
// Java code to show that UnsupportedOperationException
// will be thrown when ImmutableList is modified.
import java.util.*;
class GfG {
public static void main(String args[])
{
// empty immutable map
List list = List.of();
// Lets try adding element in List
List.add("Geeks");
}
}
输出 :
Exception in thread "main" java.lang.UnsupportedOperationException
at com.google.common.collect.ImmutableCollection.add(ImmutableCollection.java:218)
at ImmutableListDemo.main(Main.java:16)
它与 Collections.unmodifiableList() 有何不同?
Collections.unmodifiableList 围绕相同的现有 List 创建一个包装器,这样包装器就不能用于修改它。但是我们仍然可以更改原始列表。
// Java program to demonstrate that a List created using
// Collections.unmodifiableList() can be modified indirectly.
import java.io.*;
import java.util.*;
class GFG {
public static void main(String[] args)
{
List list = new ArrayList<>();
list.add("Geeks");
// Create ImmutableList from List using copyOf()
List iList = Collections.unmodifiableList(list);
// We change List and the changes reflect in iList.
list.add("For");
list.add("Geeks");
System.out.println(iList);
}
}
输出:
[Geeks, For, Geeks]
如果我们从现有 List 创建一个 ImmutableList 并更改现有 List,则 ImmutableList 不会更改,因为创建了一个副本。
// Below is a Java program for
// Creating an immutable List using copyOf()
// and modifying original List.
import java.io.*;
import java.util.*;
import com.google.common.collect.ImmutableList;
class GFG {
public static void main(String[] args)
{
List list = new ArrayList<>();
list.add("Geeks");
// Create ImmutableList from List using copyOf()
ImmutableList iList = ImmutableList.copyOf(list);
// We change List and the changes wont reflect in iList.
list.add("For");
list.add("Geeks");
System.out.println(iList);
}
}
输出 :
[Geeks]