📜  在Java中迭代不可修改的集合(1)

📅  最后修改于: 2023-12-03 14:51:17.730000             🧑  作者: Mango

在Java中迭代不可修改的集合

Java中的集合框架为程序员提供了一些很方便的数据结构来存储元素,例如List、Set和Map。但是由于Java是一种面向对象的程序设计语言,数据也可能是不可修改的,即只读数据。

在Java中,我们可以通过集合框架中提供的Collections.unmodifiableXXX()方法来操作这些只读集合。这些方法可以将一个可修改的集合转换为只读集合。这样的好处是可以将传递给其他部分的只读集合保护起来,使得其他部分无法修改,从而提高程序的安全性。

但是,在使用只读集合时,我们要注意一些细节。其中一个是如何在不违反只读集合的前提下迭代它。

迭代只读集合

对于只读集合,我们不能直接使用集合中的方法来添加、删除、修改元素。但是我们仍然可以使用它们提供的迭代器进行迭代。迭代器是用来遍历集合中元素的一个接口,它提供了访问集合中元素的方法,以及对集合中元素的处理方法。只读集合也实现了这个接口。

在Java中,集合的迭代器是通过Iterable接口中的iterator()方法来获取的。如果一个集合实现了Iterable接口,就表明它支持迭代器。

public interface Iterable<T> {
    Iterator<T> iterator();
}

通过迭代器可以遍历集合的每个元素:

List<String> list = Arrays.asList("A", "B", "C");
// 获取迭代器
Iterator<String> iterator = list.iterator();
// 遍历元素
while (iterator.hasNext()) {
    String element = iterator.next();
    System.out.println(element);
}
不可修改集合的迭代

对于只读集合,我们也可以直接使用上述的代码来获取迭代器进行遍历,但是我们需要注意,只读集合在迭代过程中是不允许修改它的元素的。如果我们在遍历只读集合时试图修改其中的元素,那么就会抛出UnsupportedOperationException异常。

List<String> list = Arrays.asList("A", "B", "C");
List<String> unmodifiableList = Collections.unmodifiableList(list);
Iterator<String> iterator = unmodifiableList.iterator();
while (iterator.hasNext()) {
    String element = iterator.next();
    // 试图修改只读集合中的元素会抛出异常
    unmodifiableList.add("D"); // UnsupportedOperationException
}

因此,当我们遍历一个只读集合时,只能读取集合中的元素,不能修改它们。如果需要修改集合中的元素,我们需要先将只读集合转换为可修改集合。

将只读集合转换为可修改集合

我们可以在需要修改只读集合中元素的时候,将只读集合转换为可修改集合来完成修改操作。可以使用Collections.unmodifiableXXX()方法将一个可修改的集合转换为只读集合,相应的,也可以使用Collections.xxx()方法将一个只读集合转换为可修改集合。


List<String> list = Arrays.asList("A", "B", "C");
List<String> unmodifiableList = Collections.unmodifiableList(list);

// 将只读集合转换为可修改集合
List<String> mutableList = new ArrayList<>(unmodifiableList);
mutableList.add("D");

转换为可修改集合后,就可以修改集合元素了。

结论

只读集合是Java中一种很有用的数据结构,它提供了一种方便的方式来传递只读数据。通过迭代器,我们可以遍历只读集合中的元素,但是在遍历时需要注意不要修改集合中的元素。如果需要修改集合中的元素,可以通过将只读集合转换为可修改集合来完成。