Java中的不可变List
- ImmutableList是一种不可变的List类型。这意味着,在声明后,List的内容是固定的或不变的,即它们是只读的。
- 如果尝试添加、删除和更新List中的元素,则会抛出UnsupportedOperationException异常。
- ImmutableList也不允许存在null元素。
- 如果试图创建一个包含null元素的ImmutableList,则会抛出NullPointerException异常。如果尝试将null元素添加到List中,则会抛出UnsupportedOperationException异常。
ImmutableList的优点
- 它们是线程安全的。
- 它们的内存效率高。
- 由于它们是不可变的,因此可以将它们传递给第三方库而没有任何问题。
注意,它是一个不可变的集合,而不是不可变对象的集合,因此其中的对象可以修改。
类声明:
@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
ImmutableList可以通过各种方法创建,包括:
使用Guava的copyOf()函数从现有列表创建ImmutableList
// 以下是创建ImmutableList的Java程序
import com.google.common.collect.ImmutableList;
import java.util.*;
class GFG {
// 从List创建ImmutableList的函数
public static <T> void iList(List<T> list)
{
// 使用copyOf()从Map创建ImmutableMap
ImmutableList<T> immutableList = ImmutableList.copyOf(list);
// 打印ImmutableMap
System.out.println(immutableList);
}
public static void main(String[] args)
{
List<String> list = new ArrayList<>(Arrays.asList("Geeks", "For", "Geeks"));
iList(list);
}
}
输出:
[Geeks, For, Geeks]
使用Guava的of()函数创建新的ImmutableList
// 以下是创建ImmutableList的Java程序
import com.google.common.collect.ImmutableList;
import java.util.*;
class GFG {
// 创建ImmutableList的函数
public static void iList()
{
// 使用of()函数创建ImmutableList
ImmutableList<String> immutableList = ImmutableList.of("Geeks", "For", "Geeks");
// 打印ImmutableList
System.out.println(immutableList);
}
public static void main(String[] args)
{
iList();
}
}
输出:
[Geeks, For, Geeks]
使用Java 9中的Factory Of()方法
在Java中,可以使用Set、Map或List和of()一起创建不可变的List。
请注意:以下程序是Java 9的。因此你需要Java 9编译器来运行它们。
// Java代码说明of()方法创建不可变集
import java.util.*;
import com.google.common.collect.ImmutableList;
class GfG {
public static void main(String args[])
{
// 非空不可变集
List<String> list = List.of("Geeks", "For", "Geeks");
// 打印列表
System.out.println(list);
}
}
输出:
[Geeks, For, Geeks]
使用ImmutableList中的Builder()函数
在Guava中,ImmuableList类提供了一个Builder()函数。通过这个函数,可以创建一个新的ImmutableList,或者从现有的List创建一个ImmutableList,或者两者兼而有之。
- 创建新的ImmutableList
// Java代码说明of()方法创建不可变集
import java.util.*;
import com.google.common.collect.ImmutableList;
class GfG {
public static void main(String args[])
{
// 不为空的不可变集合
ImmutableList<String> iList = ImmutableList.<String>builder()
.add("Geeks", "For", "Geeks")
.build();
// 打印List
System.out.println(iList);
}
}
输出:
[Geeks, For, Geeks]
从现有List中创建ImmutableList
// Java代码说明of()方法创建不可变集
import java.util.*;
import com.google.common.collect.ImmutableList;
class GfG {
public static void main(String args[])
{
List<String> list = new ArrayList<>(Arrays.asList("Geeks", "For", "Geeks"));
//使用builder()函数从现有的List创建ImmutableList
ImmutableList<String> iList = ImmutableList.<String>builder()
.addAll(list)
.build();
// 打印List
System.out.println(iList);
}
}
输出:
[Geeks, For, Geeks]
创建一个新的ImmutableList,包括现有的列表
// Java代码演示了of()方法创建ImmutableList
import java.util.*;
import com.google.common.collect.ImmutableList;
class GfG {
public static void main(String args[]) {
// 非空不可变集合
List list = List.of("Geeks", "For", "Geeks");
ImmutableList iList = ImmutableList.builder()
.addAll(list)
.add("Computer", "Portal")
.build();
// 打印集合
System.out.println(iList);
}
}
输出:
[Geeks, For, Geeks, Computer, Portal]
尝试更改ImmutableList
如先前所述,下面的程序将会抛出 UnsupportedOperationException 。
// Java代码,演示更改ImmutableList时会抛出UnsupportedOperationException。
import java.util.*;
class GfG {
public static void main(String args[])
{
// 空不可变映射
List<String> list = List.of();
// 让我们尝试向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,以使不能使用包装器来修改它。但是我们仍然可以更改原始List。
// Java程序,演示使用Collections.unmodifiableList()创建的List可以间接修改。
import java.io.*;
import java.util.*;
class GFG {
public static void main(String[] args)
{
List<String> list = new ArrayList<>();
list.add("Geeks");
// 使用copyOf()从List创建ImmutableList
List<String> iList = Collections.unmodifiableList(list);
// 我们更改List而更改反映在iList中。
list.add("For");
list.add("Geeks");
System.out.println(iList);
}
}
输出:
[Geeks, For, Geeks]
如果我们从现有List创建ImmutableList并更改现有List,则ImmutableList不会更改,因为创建了一个副本。
// 以下是Java程序
// 使用copyOf()创建不可变列表
// 并修改原始列表。
import java.io.*;
import java.util.*;
import com.google.common.collect.ImmutableList;
class GFG {
public static void main(String[] args)
{
List<String> list = new ArrayList<>();
list.add("Geeks");
// 使用copyOf()从List创建ImmutableList
ImmutableList<String> iList = ImmutableList.copyOf(list);
// 我们更改List而更改在iList中不会反映。
list.add("For");
list.add("Geeks");
System.out.println(iList);
}
}
输出:
[Geeks]
极客教程