Guava —— Collections

不可变集合

不可变集合应用场景

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<TypeThatsTooLongForItsOwnGood> listguava = Lists.newArrayList();
        Map<String, TypeThatsTooLongForItsOwnGood> map = Maps.newLinkedHashMap();

        //也可通过create静态方法创建集合
        Multiset<String> multiset = HashMultiset.create();


        //初始化时指定起始元素
        Set<String> copySet = Sets.newHashSet(elements);
        List<String> theseElements = Lists.newArrayList("alpha", "beta", "gamma");
    }

新型集合

接口,各自成套list、map、set实现(hash、linked)

1、Bitmap:双向映射 根据value 获取key Map

        BiMap<Integer, String> 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<K, Collection<V>>封装

        Multimap<String, String> 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<String> fruits = myMultimap.get("Fruits");
        System.out.println(fruits); // [Bannana, Apple, Pear]

3、Multiset:Set加一个元素计数器,元素可重复,可count重复

      //create a multiset collection
      Multiset<String> 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<String> 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

猜你喜欢

转载自blog.csdn.net/Daybreak1209/article/details/82224820