Collections.unmodifiableList

打印 上一主题 下一主题

主题 578|帖子 578|积分 1734

Collections.unmodifiableList 是 Java Collections Framework 提供的一个方法,用于创建一个不可修改的视图(unmodifiable view)列表。这个方法返回的列表是对原始列表的一个包装,任何对这个包装列表的修改操作都会抛出 UnsupportedOperationException。
使用场景



  • 防止修改:当你盼望一个列表在某个范围内不可修改时,可以使用 Collections.unmodifiableList 来创建一个不可修改的视图。
  • 安全性:在方法返回一个列表时,使用不可修改的视图可以防止调用者修改原始列表,从而提高代码的安全性和稳固性。
示例代码

以下是怎样使用 Collections.unmodifiableList 的示例:
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.List;
  4. public class UnmodifiableListExample {
  5.     public static void main(String[] args) {
  6.         // 创建一个可修改的列表
  7.         List<String> modifiableList = new ArrayList<>();
  8.         modifiableList.add("Apple");
  9.         modifiableList.add("Banana");
  10.         modifiableList.add("Cherry");
  11.         // 创建一个不可修改的视图列表
  12.         List<String> unmodifiableList = Collections.unmodifiableList(modifiableList);
  13.         // 输出不可修改的列表
  14.         System.out.println("Unmodifiable List: " + unmodifiableList);
  15.         // 尝试修改不可修改的列表(会抛出 UnsupportedOperationException)
  16.         try {
  17.             unmodifiableList.add("Date");
  18.         } catch (UnsupportedOperationException e) {
  19.             System.out.println("Cannot modify unmodifiable list: " + e.getMessage());
  20.         }
  21.         // 修改原始列表
  22.         modifiableList.add("Date");
  23.         // 输出不可修改的列表(会反映原始列表的修改)
  24.         System.out.println("Unmodifiable List after modifying original list: " + unmodifiableList);
  25.     }
  26. }
复制代码
解释


  • 创建可修改的列表:首先创建一个 ArrayList,并添加一些元素。
  • 创建不可修改的视图列表:使用 Collections.unmodifiableList 方法创建一个不可修改的视图列表。
  • 尝试修改不可修改的列表:尝试对不可修改的列表进行添加操作,会抛出 UnsupportedOperationException。
  • 修改原始列表:修改原始列表后,不可修改的视图列表会反映这些修改,因为它只是对原始列表的一个包装。
留意事项



  • 不可修改的视图:Collections.unmodifiableList 返回的列表只是一个视图,原始列表的修改会反映到这个视图中。
  • 线程安全:Collections.unmodifiableList 并不包管线程安全。如果必要线程安全的不可修改列表,可以使用 Collections.synchronizedList 和 Collections.unmodifiableList 结合使用。
线程安全示例

如果必要线程安全的不可修改列表,可以这样做:
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.List;
  4. public class ThreadSafeUnmodifiableListExample {
  5.     public static void main(String[] args) {
  6.         // 创建一个线程安全的可修改列表
  7.         List<String> synchronizedList = Collections.synchronizedList(new ArrayList<>());
  8.         synchronizedList.add("Apple");
  9.         synchronizedList.add("Banana");
  10.         synchronizedList.add("Cherry");
  11.         // 创建一个不可修改的视图列表
  12.         List<String> unmodifiableList = Collections.unmodifiableList(synchronizedList);
  13.         // 输出不可修改的列表
  14.         System.out.println("Unmodifiable List: " + unmodifiableList);
  15.         // 尝试修改不可修改的列表(会抛出 UnsupportedOperationException)
  16.         try {
  17.             unmodifiableList.add("Date");
  18.         } catch (UnsupportedOperationException e) {
  19.             System.out.println("Cannot modify unmodifiable list: " + e.getMessage());
  20.         }
  21.         // 修改原始列表
  22.         synchronizedList.add("Date");
  23.         // 输出不可修改的列表(会反映原始列表的修改)
  24.         System.out.println("Unmodifiable List after modifying original list: " + unmodifiableList);
  25.     }
  26. }
复制代码
通过这种方式,可以确保列表在多线程环境下的安全性,同时防止对列表的修改。
List的拷贝

在 Java 中,有多种方法可以复制一个 List。以下是一些常见的方法:
1. 使用 ArrayList 构造函数

你可以使用 ArrayList 的构造函数来创建一个新的 ArrayList,并将原始列表的元素复制到新的列表中。
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class ListCopyExample {
  4.     public static void main(String[] args) {
  5.         List<String> originalList = new ArrayList<>();
  6.         originalList.add("Apple");
  7.         originalList.add("Banana");
  8.         originalList.add("Cherry");
  9.         // 使用 ArrayList 构造函数复制列表
  10.         List<String> copiedList = new ArrayList<>(originalList);
  11.         // 输出复制的列表
  12.         System.out.println("Copied List: " + copiedList);
  13.     }
  14. }
复制代码
2. 使用 Collections.copy

Collections.copy 方法可以将一个列表的内容复制到另一个列表中。必要留意的是,目标列表必须有足够的空间来容纳源列表的全部元素。
  1. import java.util.ArrayList;
  2. import java.util.Collections;
  3. import java.util.List;
  4. public class ListCopyExample {
  5.     public static void main(String[] args) {
  6.         List<String> originalList = new ArrayList<>();
  7.         originalList.add("Apple");
  8.         originalList.add("Banana");
  9.         originalList.add("Cherry");
  10.         // 创建一个大小相同的目标列表
  11.         List<String> copiedList = new ArrayList<>(Collections.nCopies(originalList.size(), (String) null));
  12.         // 使用 Collections.copy 复制列表
  13.         Collections.copy(copiedList, originalList);
  14.         // 输出复制的列表
  15.         System.out.println("Copied List: " + copiedList);
  16.     }
  17. }
复制代码
3. 使用 addAll 方法

你可以使用 addAll 方法将一个列表的全部元素添加到另一个列表中。
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class ListCopyExample {
  4.     public static void main(String[] args) {
  5.         List<String> originalList = new ArrayList<>();
  6.         originalList.add("Apple");
  7.         originalList.add("Banana");
  8.         originalList.add("Cherry");
  9.         // 创建一个新的列表
  10.         List<String> copiedList = new ArrayList<>();
  11.         // 使用 addAll 方法复制列表
  12.         copiedList.addAll(originalList);
  13.         // 输出复制的列表
  14.         System.out.println("Copied List: " + copiedList);
  15.     }
  16. }
复制代码
4. 使用 stream 和 Collectors.toList

你可以使用 Java 8 的 stream API 和 Collectors.toList 方法来复制一个列表。
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. import java.util.stream.Collectors;
  4. public class ListCopyExample {
  5.     public static void main(String[] args) {
  6.         List<String> originalList = new ArrayList<>();
  7.         originalList.add("Apple");
  8.         originalList.add("Banana");
  9.         originalList.add("Cherry");
  10.         // 使用 stream 和 Collectors.toList 复制列表
  11.         List<String> copiedList = originalList.stream().collect(Collectors.toList());
  12.         // 输出复制的列表
  13.         System.out.println("Copied List: " + copiedList);
  14.     }
  15. }
复制代码
5. 使用 clone 方法(适用于 ArrayList)

如果你使用的是 ArrayList,可以直接使用其 clone 方法来复制列表。
  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class ListCopyExample {
  4.     public static void main(String[] args) {
  5.         List<String> originalList = new ArrayList<>();
  6.         originalList.add("Apple");
  7.         originalList.add("Banana");
  8.         originalList.add("Cherry");
  9.         // 使用 clone 方法复制列表
  10.         List<String> copiedList = (List<String>) ((ArrayList<String>) originalList).clone();
  11.         // 输出复制的列表
  12.         System.out.println("Copied List: " + copiedList);
  13.     }
  14. }
复制代码
总结

以上方法都可以用来复制一个 List,具体选择哪种方法取决于你的需求和使用场景。如果你必要一个简单的、快速的复制,可以使用 ArrayList 构造函数或 addAll 方法。如果你必要更灵活的操作,可以思量使用 stream 和 Collectors.toList。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表