Java中的不可变List

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]

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程