Java UnmodifiableList 和 AbstractImmutableList 的区别
- java.util.Collections.UnmodifiableList
- java.util.ImmutableCollections.AbstractImmutableList
UnmodifiableList
- 本质上是对一个原始可变列表的包装,UnmodifiableList 只读不允许增删改操作
- 不保证线程安全,如果原始列表被修改,此列表会实时反映这些变化
public static void main(String[] args) {
List<String> mutableList = new ArrayList<>();
mutableList.add("A");
mutableList.add("B");
List<String> unmodifiableList = Collections.unmodifiableList(mutableList);
mutableList.add("D");
System.out.println(mutableList);
System.out.println(unmodifiableList);
}
AbstractImmutableList
- ImmutableCollections 是 Java 9 引入的可以用于创建不可变集合的工具类
- 线程安全,元素固定,不能修改,与原列表完全隔离,修改原列表不影响此列表
- 不支持 null 元素
public static void main(String[] args) {
List<String> immutableList = List.of("A", "B");
System.out.println(immutableList);
}
public static void main(String[] args) {
List<String> mutableList = new ArrayList<>();
mutableList.add("A");
mutableList.add("B");
List<String> immutableList = List.copyOf(mutableList);
mutableList.add("D");
System.out.println(mutableList);
System.out.println(immutableList);
}
UnmodifiableList 应用
public class DeviceManage {
private String userId;
public String getUserId() {
return userId;
}
public void setUserId(String userId) {
this.userId = userId;
}
private List<String> deviceList = new ArrayList<>();
public void addDevice(String device) {
deviceList.add(device);
}
public void removeDevice(String device) {
deviceList.remove(device);
}
public List<String> getDeviceList() {
return Collections.unmodifiableList(deviceList);
}
}
public static void main(String[] args) {
DeviceManage deviceManage = new DeviceManage();
deviceManage.addDevice("device 01");
deviceManage.addDevice("device 02");
deviceManage.addDevice("device 03");
deviceManage.removeDevice("device 02");
for (String device : deviceManage.getDeviceList()) {
System.out.println(device);
}
}