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 并用一个默认值填充它。该示例显示了如何用指定的值替换所有元素。
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
与整数列表一起使用。我们创建一个包含一些初始值的列表,然后用一个默认数字填充它。该示例演示了数值填充。
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 实例填充它。该示例显示了对象引用行为。
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 处理。
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 个元素的列表,并用一个默认字符串填充它。该示例显示了性能考虑因素。
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
操作即使对于大型列表也很有效,因为它只是迭代并设置每个元素。
输出显示了填充操作所花费的时间,并验证了第一个和最后一个元素都已正确设置为默认值。
填充子列表
此示例演示了如何通过使用子列表仅填充列表的一部分。我们创建了一个数字列表,并且仅填充其中的特定范围。该示例演示了部分列表填充。
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
创建一个不可修改的列表,并尝试填充它。该示例显示了预期的异常。
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教程。