概述
ImmutableMap 的作用就是:可以让java代码也能够创建一个对象常量映射,来保存一些常量映射的键值对。
不可变集合,顾名思义就是说集合是不可被修改的。集合的数据项是在创建的时候提供,并且在整个生命周期中都不可改变。
为什么要用immutable对象?immutable对象有以下的优点: 1.对不可靠的客户代码库来说,它使用安全,可以在未受信任的类库中安全的使用这些对象 2.线程安全的:immutable对象在多线程下安全,没有竞态条件 3.不需要支持可变性, 可以尽量节省空间和时间的开销. 所有的不可变集合实现都比可变集合更加有效的利用内存 (analysis) 4.可以被使用为一个常量,并且期望在未来也是保持不变的
使用
Map<String,Object> immutableMap = new ImmutableMap.Builder<String,Object>().build();
ImmutableMap<Integer, Integer> map = ImmutableMap.of(1, 1, 2, 2, 3, 3, 4, 4, 5, 5);
在创建时放值:
Map<String,Object> immutableMap = new ImmutableMap.Builder<String,Object>()
.put("k1","v1")
.put("k2","v2")
.build();
创建后不可变:
immutableMap.put("k1","v3");
ImmutableMap中key和value均不能为null,放入null值会抛出NPE
ImmutableMap的使用场景:
适合
- 确定性的配置, 比如根据不同的key值得到不同的请求url(避免了if else 或者 switch case语句)
- 写单元测试
不适合
- key, value为未知参数, 可能有null产生的情况
注意
这个map只是只能通过初始化的时候添加元素,如果元素类型是对象类型,对象的引用是可以改变的,如下代码案例:
public class ImmtableMapTests {
public static void main(String[] args) {
Person person = new Person("434");
ImmutableMap<String,Person> immutableMap = new ImmutableMap.Builder<String,Person>()
.put("k1",person)
.build();
System.out.println(immutableMap.get("k1"));
person.setName("77777");
System.out.println(immutableMap.get("k1"));
}
}
class Person {
public String name;
public Person(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
}
执行结果:
Person{name='434'}
Person{name='77777'}
|