每日一道面试题之怎么确保一个集合不能被修改?

要确保一个集合不能被修改,可以采取以下几种方式:

使用不可变集合:使用不可变集合类(如 Collections.unmodifiableList()Collections.unmodifiableSet()Collections.unmodifiableMap() 等)创建一个只读的集合。这样,任何尝试修改集合的操作都会抛出 UnsupportedOperationException 异常。

举例:

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

public class Test2 {
    public static void main(String[] args) {
        List<String> list=new ArrayList<>();
        list.add("苹果");
        list.add("西瓜");
        list.add("香蕉");
        List<String> unmodifiableList= Collections.unmodifiableList(list);
        unmodifiableList.add("榴莲");
    }
}

上述实例中,我们尝试对不可变集合进行修改,抛出如下异常:

每日一道面试题之怎么确保一个集合不能被修改?_第1张图片

使用只读接口:使用只读接口(如 List、Set、Map 等)声明集合类型,并且只提供读取元素的方法不提供修改元素的方法。这样,在使用集合的代码中,只能调用读取元素的方法,而无法调用修改元素的方法。

List<String> list=new ArrayList<>();
list.add("苹果");
list.add("西瓜");
list.add("香蕉");
//声明集合的类型是可读的
List<String> readOnlyList = Collections.unmodifiableList(list);
readOnlyList.add("grape"); //编译错误,抛出UnsupportedOperationException

使用防御性复制:在返回集合的方法中,使用防御性复制的方式,将集合的副本返回给调用者,这就使得调用者无法直接修改原始集合,只能修改副本。

举例:

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

public class Test2 {
    private static List<String> list=new ArrayList<>();
    public static List<String> getList(){
        return new ArrayList<>();
    }
    public static void main(String[] args) {
        List<String> readOnlyList = getList();//返回原始集合的副本
        readOnlyList.add("grape"); // 仅修改副本,不影响原始集合
        System.out.println("原始集合如下所示:");
        System.out.println(list);
        System.out.println("副本集合如下所示:");
        System.out.println(readOnlyList);
    }
}

输出如下所示:

原始集合如下所示:
[]
副本集合如下所示:
[grape]

需要注意的是,以上方法只能防止直接修改集合对象,但无法防止修改集合中的可变对象如果集合中的元素是可变对象,仍然可以通过引用修改对象的属性。如果需要确保集合中的元素也不能被修改,可以使用不可变对象或者进行深拷贝来保护集合中的元素。

你可能感兴趣的:(Java面试题,windows,microsoft,开发语言,java,后端,面试)