不可变集合是不可被修改的。集合的数据项是在创建的时候提供,并且在整个生命周期中都不可改变。
Immutable集合有以下的优点:
1.对不可靠的客户代码库来说,它使用安全,可以在未受信任的类库中安全的使用这些对象
2.线程安全的:immutable对象在多线程下安全,没有竞态条件
3.不需要支持可变性, 可以尽量节省空间和时间的开销. 所有的不可变集合实现都比可变集合更加有效的利用内存
4.可以被使用为一个常量,并且期望在未来也是保持不变的
//不可变集合
ImmutableList<String> list = ImmutableList.of("B", "A", "C", "D", "A");
ImmutableMap<String, String> map = ImmutableMap.of("key2", "value2", "key1", "value1");
ImmutableMultimap<String, String> multimap = ImmutableMultimap.of("key1", "value11", "key2", "value2", "key1", "value1"); //键值允许有多个
ImmutableSortedMap<String, String> sortedMap = ImmutableSortedMap.of("key2", "value2", "key1", "value1"); //键排序
ImmutableSet<String> set = ImmutableSet.of("B", "A", "C", "D", "A"); //值不重复。自动去掉重复值
ImmutableMultiset<String> multiset = ImmutableMultiset.of("B", "A", "C", "D", "A"); //值允许重复
ImmutableSortedSet<String> sortedSet = ImmutableSortedSet.of("B", "A", "C", "D", "A"); //值排序且不重复。自动去掉重复值
ImmutableSortedMultiset<String> sortedMultiset = ImmutableSortedMultiset.of("B", "A", "C", "D", "A"); //值排序且可重复
/*
List<String> list2 = new ArrayList<String>();
list2.add("A");
list2.add("B");
list2.add("C");
ImmutableList<String> imlist = ImmutableList.copyOf(list2); //List拷贝成ImmutableList
System.out.println("imlist:" + imlist);
*/
System.out.println("### list ###");
System.out.println(list);
System.out.println();
System.out.println("### map ###");
System.out.println(map);
System.out.println(multimap);
System.out.println(sortedMap);
System.out.println();
System.out.println("### set ###");
System.out.println(set);
System.out.println(multiset);
System.out.println(sortedSet);
System.out.println(sortedMultiset);
System.out.println(ImmutableSortedMultiset.copyOf(set)); //ImmutableSet拷贝成ImmutableSortedMultiset
执行结果如下:
### list ###
[B, A, C, D, A]
### map ###
{key2=value2, key1=value1}
{key1=[value11, value1], key2=[value2]}
{key1=value1, key2=value2}
### set ###
[B, A, C, D]
[B, A x 2, C, D]
[A, B, C, D]
[A x 2, B, C, D]
[A, B, C, D]