Java的集合框架是Java类库当中使用频率最高的部分之一,Google公司发起了一个项目,用来扩展Java的集合框架,提供一些高级的集合操作API。
· 新的集合类型:Multimap, Multiset, BiMap和一些其它的类型; · 高效的不可变集合类型,例如:ImmutableSet; · 更方便的集合排序功能; · 新增了一个被称之为MapMaker的类 用于创建带有更多高级特性的并发HashMap; · 新增了针对集合类的迭代器和迭代器工具类,用于方便的实现各种集合类的迭代; · 新增了很多针对Lists,Sets和Maps的工具类; · 新增了转发集合类,借助转发集合类,可以自定义集合类的特性,而不需要继承其它集合类; · 新增了针对帮助类的实现,例如:AbstractIterator…… 1. Immutable 不可变的 Goolgle collection中有一堆ImmutableXXX,比如ImmutableList、ImmutableMap。 在标准JDK的Collections,有Collections.unmodifiableCollection方法可以返回指定集合的不可修改视图,这个视图无法更改,但是当原集合发生改变时,他也会跟着改变。 而google的Immutable,则是在任何情况下都无法修改,类似这种对象安全,不易出错。虽然JDK的unmodifiable方法也能保证集合视图的不变性。但是Immutable能“保证不可改变”,“极易使用”,“更快”,“使用更少的内存(比如ImmutableSet能少2-3X)”。 虽然这些类不是final的,但是他们都没有公共的或者受保护的构造方法,所以可以保证不会被修改。ImmutableXXX都需要ImmutableXX.Builder类去创建,这些builder类,可以添加多个相应集合,然后依次性的build。 List list=new ArrayList(); list.add("a"); list.add("b"); list.add("c"); List list2=new ArrayList(); list2.add("a"); list2.add("b"); //以前 List T_LIST=Collections.unmodifiableList(list); Set<Integer> LUCKY_NUMBERS = Collections.unmodifiableSet(new LinkedHashSet<Integer>( Arrays.asList(4, 8, 15, 16, 23, 42))); ImmutableList.Builder ib=new ImmutableList.Builder(); ib.add(list); ImmutableList<String> il=ib.build(); ListIterator li=il.listIterator(); while(li.hasNext()){ System.out.println(li.next()); } il=il.of("1234", "3434", "6666"); li=il.listIterator(); while(li.hasNext()){ System.out.println(li.next()); } 结果: [a, b, c] 1234 3434 6666 Set和Map也是类似的。 2. Multisets 重复的,允许重复的元素,无序的。 List:有序的,允许重复 Set:无序的,不允许重复 HashMultiMap(继承自MultiMap)、HashMultiSet(继承自MultiSet)。Map中看,一个键可以有多个重复的值,所以他的get(K)方法返回一个集合。 有 Multimap implementations:ImmutableMultimap,ArrayListMultimap,HashMultimap LinkedHashMultimap,TreeMultimap等。 原来的代码,在将一个元素加入一个set或者map前,一般都先调用get方法判断一下,现在使用multi系列,直接加入就可以了。 大多数Map的方法和Multimaps是一样的,比如说,size(), isEmpty(),containsKey(), containsValue() put(), putAll(),clear(),values() 有些有点区别,比如说,get()返回Collection<V>而不是V,remove(K)变成remove(K,V)和 removeAll(K),keySet()变成keys(),entrySet()变成entries(); public static void main(String[] args) { Map<String, Integer> m =new TreeMap<String, Integer>(); for (String word : args) { Integer freq = m.get(word); //以前加入之前总是要判断 m.put(word, (freq == null ? 1 : freq + 1)); } System.out.println(m); } 3. BiMap (bidirectional map)键和值都是唯一的,所以可以双向转换 BiMap implementations:EnumBiMap, EnumHashBiMap, HashBiMap, ImmutableBiMap 以前: Java代码 private static final Map<Integer, String> NUMBER_TO_NAME; private static final Map<String, Integer> NAME_TO_NUMBER; static { NUMBER_TO_NAME = Maps.newHashMap(); NUMBER_TO_NAME.put(1, "Hydrogen"); NUMBER_TO_NAME.put(2, "Helium"); NUMBER_TO_NAME.put(3, "Lithium"); /* reverse the map programatically so the actual mapping is not repeated */ NAME_TO_NUMBER = Maps.newHashMap(); for (Integer number : NUMBER_TO_NAME.keySet()) { NAME_TO_NUMBER.put(NUMBER_TO_NAME.get(number), number); } } //根据value获取key public static int getElementNumber(String elementName) { return NAME_TO_NUMBER.get(elementName); } //根据num类型的key获取 public static String getElementName(int elementNumber) { return NUMBER_TO_NAME.get(elementNumber); } private static final Map<Integer, String> NUMBER_TO_NAME; private static final Map<String, Integer> NAME_TO_NUMBER; static { NUMBER_TO_NAME = Maps.newHashMap(); NUMBER_TO_NAME.put(1, "Hydrogen"); NUMBER_TO_NAME.put(2, "Helium"); NUMBER_TO_NAME.put(3, "Lithium"); /* reverse the map programatically so the actual mapping is not repeated */ NAME_TO_NUMBER = Maps.newHashMap(); for (Integer number : NUMBER_TO_NAME.keySet()) { NAME_TO_NUMBER.put(NUMBER_TO_NAME.get(number), number); } } public static int getElementNumber(String elementName) { return NUMBER_TO_NAME.get(elementName); } public static string getElementName(int elementNumber) { return NAME_TO_NUMBER.get(elementNumber); } 现在: static { NUMBER_TO_NAME_BIMAP = HashBiMap.create(); NUMBER_TO_NAME_BIMAP.put(1, "Hydrogen"); NUMBER_TO_NAME_BIMAP.put(2, "Helium"); NUMBER_TO_NAME_BIMAP.put(3, "Lithium"); } //更好,如果是数据量比较小,直接使用ImmutableBiMap.of更方便 private static final BiMap<Integer,String> NUMBER_TO_NAME_BIMAP1 = new ImmutableBiMap.Builder<Integer,String>() .put(1, "Hydrogen") .put(2, "Helium") .put(3, "Lithium").build(); public static int getElementNumber1(String elementName) { return NUMBER_TO_NAME_BIMAP.inverse().get(elementName); } public static String getElementName1(int elementNumber) { return NUMBER_TO_NAME_BIMAP.get(elementNumber); } 4. MapMaker 一个ConcurrentMap的构建者,提供下列各种组合(soft/weak的values,soft/weak的keys,超时时间),需要的时候,可以指定自己的处理函数,相比较于WeakHashMap,他更好用,更强大。 http://www./topic/670414
|
|