不可变集合应用场景
1、如果你没有修改某个集合的需求,或者希望某个集合保持不变时,把它防御性地拷贝到不可变集合是个很好的实践。(当某组数据变化不是很频繁,则可以使用不可变对象)
2、创建对象的不可变拷贝是一项很好的防御性编程技巧,线程安全(final 属性在对象初始化时就构造好-JVM在构造完对象时可能只是为其分配了引用空间,而各个属性值可能还未初始化完成)
3、不需要考虑变化,节省时间和空间,所有不可变的集合都比它们的可变形式有更好的内存利用率
创建方式
ImmutableSet.copyOf(Arrays.asList(1));
ImmutableSet.of(Arrays.asList(1));
ImmutableSet.builder().addAll(Arrays.asList(1, 2)).build();
有序不可变集合:排序是在构造集合的时候完成的,入下会在构造时就把元素排序为a, b, c, d
ImmutableSortedSet.of("a", "b", "c", "a", "d", "b");
可变与不可变集合对应关系
可变集合接口 | 属于JDK还是Guava | 不可变版本 |
Collection | JDK | ImmutableCollection |
List | JDK | ImmutableList |
Set | JDK | ImmutableSet |
SortedSet/NavigableSet | JDK | ImmutableSortedSet |
Map | JDK | ImmutableMap |
SortedMap | JDK | ImmutableSortedMap |
Multiset | Guava | ImmutableMultiset |
SortedMultiset | Guava | ImmutableSortedMultiset |
Multimap | Guava | ImmutableMultimap |
ListMultimap | Guava | ImmutableListMultimap |
SetMultimap | Guava | ImmutableSetMultimap |
BiMap | Guava | ImmutableBiMap |
ClassToInstanceMap | Guava | ImmutableClassToInstanceMap |
Table | Guava | ImmutableTable |
//范型
List listguava = Lists.newArrayList();
Map map = Maps.newLinkedHashMap();
//也可通过create静态方法创建集合
Multiset multiset = HashMultiset.create();
//初始化时指定起始元素
Set copySet = Sets.newHashSet(elements);
List theseElements = Lists.newArrayList("alpha", "beta", "gamma");
}
接口,各自成套list、map、set实现(hash、linked)
1、Bitmap:双向映射 根据value 获取key Map
BiMap empIDNameMap = HashBiMap.create();
empIDNameMap.put(new Integer(101), "2");
empIDNameMap.put(new Integer(102), "3");
empIDNameMap.put(new Integer(103), "4");
//通过value获取key值
System.out.println(empIDNameMap.inverse().get("2"));
2、Multimap:Map
Multimap myMultimap = ArrayListMultimap.create();
// 添加键值对 1key:多value
myMultimap.put("Fruits", "Bannana");
//给Fruits元素添加另一个元素
myMultimap.put("Fruits", "Apple");
myMultimap.put("Fruits", "Pear");
myMultimap.put("Vegetables", "Carrot");
// 获得multimap的size
int size = myMultimap.size();
System.out.println(size); // 4
// 获得Fruits对应的所有的值
Collection fruits = myMultimap.get("Fruits");
System.out.println(fruits); // [Bannana, Apple, Pear]
3、Multiset:Set加一个元素计数器,元素可重复,可count重复
//create a multiset collection
Multiset multiset = HashMultiset.create();
multiset.add("a");
multiset.add("b");
multiset.add("c");
multiset.add("b");
//print the occurrence of an element
System.out.println("Occurrence of 'b' : "+multiset.count("b"));
//print the total size of the multiset
System.out.println("Total Size : "+multiset.size());
//get the distinct elements of the multiset as set
Set set = multiset.elementSet();
//display the elements of the set
System.out.println("Set [");
for (String s : set) {
System.out.println(s);
}
4、Table
总结自:http://ifeve.com/google-guava-eventbus/ Concurrency to be continued