ZetCode

Java Collections.singletonList

上次修改时间:2025 年 4 月 20 日

Collections.singletonList 方法是 Java 集合框架中的一个实用方法。它返回一个只包含指定对象的不可变列表。当您需要一个不可修改的单元素列表时,此方法非常有用。

返回的列表是可序列化的,并实现了 RandomAccess 接口。与创建一个包含一个元素的常规列表相比,它更节省空间。此方法尤其适用于需要列表的 API。

Collections.singletonList 概述

Collections.singletonList 创建一个不可变的单元素列表。该列表不能被修改 - 尝试添加、删除或设置元素将抛出 UnsupportedOperationException。这使其线程安全。

该方法是 java.util.Collections 实用程序类的一部分。它在 Java 1.3 中引入。该实现针对单元素存储进行了优化,使其在这种特定情况下比常规列表更有效。

基本 singletonList 用法

此示例演示了 Collections.singletonList 的最基本用法。我们创建一个包含一个字符串的单元素列表。该示例展示了如何创建和访问列表中的元素。

SingletonListBasic.java
package com.zetcode;

import java.util.Collections;
import java.util.List;

public class SingletonListBasic {

    public static void main(String[] args) {
        
        // Create a single-element list
        List<String> singleElementList = Collections.singletonList("Hello");
        
        // Access the element
        String element = singleElementList.get(0);
        System.out.println("Element: " + element);
        
        // Print the list
        System.out.println("List: " + singleElementList);
        
        // Size of the list
        System.out.println("Size: " + singleElementList.size());
    }
}

此代码创建一个只包含字符串 "Hello" 的不可变列表。然后我们使用 get(0) 访问该元素,因为它只包含一个元素。列表的大小始终为 1。

输出显示了元素值、列表表示形式,并确认了列表大小正好为 1。这演示了 singletonList 的基本行为。

尝试修改 singletonList

此示例展示了尝试修改使用 Collections.singletonList 创建的列表时会发生什么。该列表是不可变的,因此任何修改尝试都会抛出异常。

SingletonListModification.java
package com.zetcode;

import java.util.Collections;
import java.util.List;

public class SingletonListModification {

    public static void main(String[] args) {
        
        List<Integer> numbers = Collections.singletonList(42);
        
        try {
            // Attempt to add element
            numbers.add(99);
        } catch (UnsupportedOperationException e) {
            System.out.println("Cannot add: " + e.getMessage());
        }
        
        try {
            // Attempt to remove element
            numbers.remove(0);
        } catch (UnsupportedOperationException e) {
            System.out.println("Cannot remove: " + e.getMessage());
        }
        
        try {
            // Attempt to set element
            numbers.set(0, 100);
        } catch (UnsupportedOperationException e) {
            System.out.println("Cannot set: " + e.getMessage());
        }
        
        // Original list remains unchanged
        System.out.println("Original list: " + numbers);
    }
}

此代码演示了 singletonList 的不可变性。我们尝试添加、删除和修改元素,所有这些都将失败并抛出 UnsupportedOperationException。原始列表保持不变。

输出显示了每次失败的操作和异常消息。这证实了 singletonList 确实是不可变的,并且在创建后无法修改。

将 singletonList 与 API 一起使用

此示例展示了当使用需要列表的 API 时,Collections.singletonList 如何有用。我们演示了将单个值传递给期望列表参数的方法。

SingletonListApiUsage.java
package com.zetcode;

import java.util.Collections;
import java.util.List;

public class SingletonListApiUsage {

    public static void main(String[] args) {
        
        // Method that requires a List parameter
        printNames(Collections.singletonList("Alice"));
        
        // Compare with regular list creation
        printNames(List.of("Bob")); // Java 9+
    }
    
    private static void printNames(List<String> names) {
        System.out.println("Names:");
        for (String name : names) {
            System.out.println("- " + name);
        }
    }
}

在这里,我们使用 Collections.singletonList 将单个名称传递给期望列表的方法。这比仅为单个元素创建常规列表更有效。我们还展示了使用 List.of 的 Java 9+ 替代方案。

输出表明这两种方法都正确工作。该方法接收一个只包含一个元素的列表并相应地处理它。

singletonList 在 Collections.addAll 中

此示例演示了将 Collections.singletonListCollections.addAll 一起使用。我们展示了如何使用这些方法一起将单个元素有效地添加到现有集合中。

SingletonListWithAddAll.java
package com.zetcode;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SingletonListWithAddAll {

    public static void main(String[] args) {
        
        List<String> colors = new ArrayList<>();
        colors.add("Red");
        colors.add("Green");
        
        // Add single element using singletonList
        Collections.addAll(colors, Collections.singletonList("Blue").toArray(new String[0]));
        
        System.out.println("Colors: " + colors);
        
        // Alternative way
        colors.addAll(Collections.singletonList("Yellow"));
        System.out.println("Updated colors: " + colors);
    }
}

此代码展示了使用 Collections.singletonList 将单个元素添加到列表的两种方法。第一种方法使用 Collections.addAll,而第二种方法使用 List.addAll

这两种方法都实现了相同的结果,但演示了使用 singletonList 的不同方法。输出显示了列表随着每次添加而增长。

singletonList vs Arrays.asList

此示例将 Collections.singletonListArrays.asList 在创建单元素列表时进行比较。我们重点介绍了这些方法之间的关键区别。

SingletonListVsArraysAsList.java
package com.zetcode;

import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class SingletonListVsArraysAsList {

    public static void main(String[] args) {
        
        // Using singletonList
        List<String> singleton = Collections.singletonList("One");
        System.out.println("singletonList: " + singleton);
        
        // Using Arrays.asList
        List<String> asList = Arrays.asList("One");
        System.out.println("Arrays.asList: " + asList);
        
        // Modification attempts
        try {
            asList.set(0, "Modified");
            System.out.println("Modified Arrays.asList: " + asList);
        } catch (Exception e) {
            System.out.println("Cannot modify Arrays.asList: " + e.getMessage());
        }
        
        // Size comparison
        System.out.println("singletonList size: " + singleton.size());
        System.out.println("Arrays.asList size: " + asList.size());
    }
}

此示例比较了创建单元素列表的两种方法。Collections.singletonList 创建一个真正的不可变列表,而 Arrays.asList 创建一个固定大小的列表,该列表允许修改元素,但不允许结构更改。

输出显示 Arrays.asList 允许修改现有元素,但不允许更改列表大小。这两个列表都报告大小为 1,但具有不同的修改功能。

singletonList 在方法返回值中

此示例演示了将 Collections.singletonList 用作方法返回值。当一个方法需要返回一个列表但只有一个值要返回时,它特别有用。

SingletonListMethodReturn.java
package com.zetcode;

import java.util.Collections;
import java.util.List;

public class SingletonListMethodReturn {

    public static void main(String[] args) {
        
        // Get a single search result
        List<String> searchResults = searchDatabase("Java");
        System.out.println("Search results: " + searchResults);
        
        // Process the result
        if (!searchResults.isEmpty()) {
            System.out.println("First result: " + searchResults.get(0));
        }
    }
    
    private static List<String> searchDatabase(String query) {
        // Simulate database search
        if ("Java".equals(query)) {
            return Collections.singletonList("Java Programming");
        }
        return Collections.emptyList();
    }
}

在这里,我们使用 Collections.singletonList 从方法返回单个搜索结果。这比返回 null 或创建完整的列表实现更简洁。调用代码可以将结果视为常规列表。

输出显示了被返回和处理的搜索结果。该方法可以为没有匹配项返回一个空列表,从而保持一致的返回类型。

singletonList 性能

此示例演示了与常规列表实现相比,Collections.singletonList 的性能优势。我们测量了这两种方法的内存使用情况和创建时间。

SingletonListPerformance.java
package com.zetcode;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class SingletonListPerformance {

    public static void main(String[] args) {
        final int ITERATIONS = 1_000_000;
        
        // Measure ArrayList creation
        long start = System.currentTimeMillis();
        for (int i = 0; i < ITERATIONS; i++) {
            List<String> list = new ArrayList<>();
            list.add("Item");
        }
        long arrayListTime = System.currentTimeMillis() - start;
        
        // Measure singletonList creation
        start = System.currentTimeMillis();
        for (int i = 0; i < ITERATIONS; i++) {
            List<String> list = Collections.singletonList("Item");
        }
        long singletonTime = System.currentTimeMillis() - start;
        
        System.out.println("ArrayList time: " + arrayListTime + "ms");
        System.out.println("singletonList time: " + singletonTime + "ms");
        System.out.println("singletonList is " + 
            (arrayListTime / (double)singletonTime) + "x faster");
    }
}

此基准测试比较了使用 ArrayListCollections.singletonList 创建 1,000,000 个单元素列表。结果显示了这两种方法之间的显着性能差异。

输出表明,对于单元素列表,Collections.singletonList 速度更快,并且更节省内存。这使其成为您只需要在不可变列表中包含一个元素的情况的理想选择。

来源

Java Collections.singletonList 文档

在本文中,我们深入探讨了 Collections.singletonList 方法。我们涵盖了基本用法、不可变性、API 集成、性能以及与替代方案的比较。此方法是有效地使用单元素列表的宝贵工具。

作者

我的名字是 Jan Bodnar,我是一位经验丰富的程序员,在这一领域拥有多年的经验。我从 2007 年开始编写编程文章,并且已经撰写了 1,400 多篇文章和八本电子书。凭借超过八年的教学经验,我致力于分享我的知识并帮助他人掌握编程概念。

列出所有Java教程