ZetCode

Java Collections.fill 方法

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

Collections.fill 方法是 Java 集合框架中的一个实用方法。它用指定的元素替换指定列表中的所有元素。此方法是 java.util.Collections 类的一部分。

当您需要将列表中的所有元素初始化或重置为相同的值时,fill 方法很有用。它适用于任何 List 实现,并就地修改列表。该方法有一个 void 返回类型。

Collections.fill 方法概述

Collections.fill 方法的签名是:public static <T> void fill(List<? super T> list, T obj)。它接受两个参数:要填充的列表和要填充的元素。

如果列表的 set 操作不受支持,该方法将抛出 UnsupportedOperationException。它用指定的对象替换列表中的每个元素。列表大小保持不变。

Collections.fill 的基本用法

此示例演示了 Collections.fill 的基本用法。我们创建一个字符串 ArrayList 并用一个默认值填充它。该示例显示了如何用指定的值替换所有元素。

CollectionsFillBasic.java
package com.zetcode;

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

public class CollectionsFillBasic {

    public static void main(String[] args) {
        
        List<String> colors = new ArrayList<>();
        colors.add("Red");
        colors.add("Green");
        colors.add("Blue");
        
        System.out.println("Before fill: " + colors);
        
        // Fill the list with "Black"
        Collections.fill(colors, "Black");
        
        System.out.println("After fill: " + colors);
    }
}

在此示例中,我们首先创建一个包含三个颜色字符串的列表。在打印原始列表之后,我们使用 Collections.fill 将所有元素替换为 "Black"。输出显示了填充操作之前和之后的列表。

填充操作修改现有列表,而不是创建一个新列表。所有原始元素都将替换为指定的值。

填充整数列表

此示例演示了如何将 Collections.fill 与整数列表一起使用。我们创建一个包含一些初始值的列表,然后用一个默认数字填充它。该示例演示了数值填充。

CollectionsFillIntegers.java
package com.zetcode;

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

public class CollectionsFillIntegers {

    public static void main(String[] args) {
        
        List<Integer> numbers = Arrays.asList(1, 2, 3, 4, 5);
        
        System.out.println("Original numbers: " + numbers);
        
        // Fill with zero
        Collections.fill(numbers, 0);
        
        System.out.println("After filling with zero: " + numbers);
    }
}

在这里,我们使用 Arrays.asList 创建一个固定大小的整数列表。然后,我们使用 Collections.fill 将整个列表填充为零。输出演示了列表的转换。

请注意,Arrays.asList 返回一个由原始数组支持的固定大小列表。虽然我们不能添加或删除元素,但我们可以使用 fill 等方法修改现有元素。

用自定义对象填充列表

此示例演示了用自定义对象填充列表。我们创建了一个 Person 对象列表,并用一个默认的 Person 实例填充它。该示例显示了对象引用行为。

CollectionsFillObjects.java
package com.zetcode;

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

record Person(String name) {}

public class CollectionsFillObjects {

    public static void main(String[] args) {

        List<Person> people = new ArrayList<>();
        people.add(new Person("Alice"));
        people.add(new Person("Bob"));
        people.add(new Person("Charlie"));

        System.out.println("Before fill: " + people);

        // Fill with a default person
        Person defaultPerson = new Person("Unknown");
        Collections.fill(people, defaultPerson);

        System.out.println("After fill: " + people);
    }
}

此示例创建一个 Person 对象列表,并用默认的 "Unknown" 人员填充它。在填充操作之后,列表中的所有元素都将成为对同一个 defaultPerson 对象的引用。

当用对象填充时,所有列表元素都将引用同一个对象实例。对该实例的任何更改都将通过所有引用可见。

用 null 值填充列表

此示例演示了如何用 null 值填充列表。我们创建一个字符串列表,并将所有元素替换为 null。该示例演示了集合中的 null 处理。

CollectionsFillNull.java
package com.zetcode;

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

public class CollectionsFillNull {

    public static void main(String[] args) {
        
        List<String> items = new ArrayList<>();
        items.add("Item1");
        items.add("Item2");
        items.add("Item3");
        
        System.out.println("Before fill: " + items);
        
        // Fill with null
        Collections.fill(items, null);
        
        System.out.println("After fill: " + items);
        
        // Check for null elements
        System.out.println("First element is null: " + (items.getFirst() == null));
    }
}

在此示例中,我们用 null 值填充列表。操作之后,列表中的所有元素都将变为 null。该示例还演示了如何在列表中检查 null 元素。

当您需要清除引用或准备列表进行新赋值时,用 null 填充可能很有用。但是,在使用 null 值时要小心,以避免 NullPointerException。

填充大型列表

此示例演示了用默认值填充大型列表。我们创建一个包含 1,000,000 个元素的列表,并用一个默认字符串填充它。该示例显示了性能考虑因素。

CollectionsFillLargeList.java
package com.zetcode;

import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class CollectionsFillLargeList {

    public static void main(String[] args) {
        
        // Create a large list with initial values
        List<String> bigList = IntStream.range(0, 1_000_000)
                .mapToObj(i -> "Initial")
                .collect(Collectors.toList());
        
        System.out.println("List created with size: " + bigList.size());
        
        long startTime = System.currentTimeMillis();
        
        // Fill with default value
        Collections.fill(bigList, "Default");
        
        long endTime = System.currentTimeMillis();
        
        System.out.println("Filling took " + (endTime - startTime) + " ms");
        System.out.println("First element: " + bigList.getFirst());
        System.out.println("Last element: " + bigList.getLast());
    }
}

此示例使用 Java Streams 创建一个大型列表,并测量填充它所花费的时间。Collections.fill 操作即使对于大型列表也很有效,因为它只是迭代并设置每个元素。

输出显示了填充操作所花费的时间,并验证了第一个和最后一个元素都已正确设置为默认值。

填充子列表

此示例演示了如何通过使用子列表仅填充列表的一部分。我们创建了一个数字列表,并且仅填充其中的特定范围。该示例演示了部分列表填充。

CollectionsFillSublist.java
package com.zetcode;

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

public class CollectionsFillSublist {

    public static void main(String[] args) {
        
        List<Integer> numbers = new ArrayList<>();
        for (int i = 1; i <= 10; i++) {
            numbers.add(i);
        }
        
        System.out.println("Original list: " + numbers);
        
        // Fill only elements from index 3 to 7 (exclusive) with 0
        Collections.fill(numbers.subList(3, 7), 0);
        
        System.out.println("After partial fill: " + numbers);
    }
}

在此示例中,我们使用 List.subList 创建原始列表的一部分的视图。然后,我们仅用零填充此子列表,而保留其他元素不变。此技术允许选择性地修改列表部分。

输出显示了原始列表和修改后的版本,其中仅将元素 4 到 6(索引 3-6)设置为零。

填充不可变列表

此示例演示了尝试填充不可变列表时会发生什么情况。我们使用 Collections.unmodifiableList 创建一个不可修改的列表,并尝试填充它。该示例显示了预期的异常。

CollectionsFillImmutable.java
package com.zetcode;

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

public class CollectionsFillImmutable {

    public static void main(String[] args) {
        
        List<String> mutable = new ArrayList<>();
        mutable.add("One");
        mutable.add("Two");
        mutable.add("Three");
        
        // Create unmodifiable list
        List<String> immutable = Collections.unmodifiableList(mutable);
        
        System.out.println("Original list: " + immutable);
        
        try {
            // Attempt to fill immutable list
            Collections.fill(immutable, "Zero");
        } catch (UnsupportedOperationException e) {
            System.out.println("Caught exception: " + e.getMessage());
        }
    }
}

此示例表明,Collections.fill 无法修改不可修改的列表。当在不可变集合上尝试该操作时,将抛出 UnsupportedOperationException

输出演示了异常被捕获和处理。此行为与其他对不可修改集合的修改尝试一致。

来源

Java Collections.fill 文档

在本文中,我们深入探讨了 Java Collections.fill 方法。我们涵盖了基本用法、填充不同类型、性能考虑事项和边缘情况。此方法是一个简单但功能强大的列表操作工具。

作者

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

列出所有Java教程