1.尽量避免使用null
1.1 不要在Set中使用null或将null当做map的键值
1.2 map中的值应该都不为null,因为通过get方法可能有二义性,可以对值为空的单独创建一个集合。
Guava中用Optional代表T类型的引用,用引用存在和引用缺失来表示null与非null(不包含null值引用,只有引用缺失)
2.前置条件:一条条件语句,在方法执行前必须为真
在编码时,如果某个值有多重的前置条件,我们建议你把它们放到不同的行,这样有助于在调试时定位。此外,把每个前置条件放到不同的行,也可以帮助你编写清晰和有用的错误消息。
3.Object方法
1.使用Objects.equal()来代替平时的Object.equals方法,因为后者需要对Object是否为null
2.Objects.hashCode(Object...)会对传入的字段序列计算出合理的、顺序敏感的散列值
3. 通过toStringHelper方法来帮助我们写toString,例如:
String s = MoreObjects.toStringHelper("AA").add("x",1).toString();
System.out.println(s);//打印结果为AA{x=1}
4.新集合类型
4.1Multiset:用于对键值进行计数
1.没有元素顺序限制的 ArrayList
• add(E)添加单个给定元素
• iterator()返回一个迭代器,包含 Multiset 的所有元素(包括重复的元素)
• size()返回所有元素的总个数(包括重复的元素)
2. Map<E, Integer>,键为元素,值为计数
• count(Object)返回给定元素的计数。HashMultiset.count 的复杂度为 O(1),TreeMultiset.count 的复杂度为 O(log n)。
• entrySet()返回 Set<Multiset.Entry>,和 Map 的 entrySet 类似。//组成一个视图
• elementSet()返回所有不重复元素的 Set,和 Map 的 keySet()类似。//将键值组成一个Set集合
• 所有 Multiset 实现的内存消耗随着不重复元素的个数线性增长。
Multiset.addAll(Collection)可以添加 Collection 中的所有元素并进行计数,这比用 for 循环往 Map 添加元素和计数方便多了。
Multiset的创建方式为:Multiset<String> mt = HashMultiset.create();
一些方法:
Multiset和Map的区别:
• Multiset 中的元素计数只能是正数。任何元素的计数都不能为负,也不能是 0。elementSet()和 entrySet()视图中也不会有这样的元素。
• multiset.size()返回集合的大小,等同于所有元素计数的总和。对于不重复元素的个数,应使用 elementSet().size()方法。(因此,add(E)把 multiset.size()增加 1)
• multiset.iterator()会迭代重复元素,因此迭代长度等于 multiset.size()。
• Multiset 支持直接增加、减少或设置元素的计数。setCount(elem, 0)等同于移除所有 elem。
• 对 multiset 中没有的元素,multiset.count(elem)始终返回 0。
4.2Multimap:用于一对多的映射
1.ListMultimap的创建:ListMultimap<String,LinkedList<String>> ml = ArrayListMultimap.create();
这个代表一个String可以映射很多个LinkedList<String>
String ww = ml.get("66").get(1).get(1);//首先获取String为"66"的,第二个LinkedList<String>中的第二个元素
如果创建方式是:ListMultimap<String,String> ml = ArrayListMultimap.create();
那么只需要两个get就可以了。
2.SetMultimap的创建:SetMultimap<String,String>setMultimap = HashMultimap.create();
二者调用get方法的返回值不同,比如创建之后,SetMultimap返回值是Set<String>,而上面的返回值是List<String>(第二个例子创建的)
4.3BiMap:完成双向映射:
可以通过下面的子类完成实例化:
可以用 inverse()反转 BiMap<K, V>的键值映射。
保证值是唯一的,因此 values()返回 Set 而不是普通的 Collection。
在 BiMap 中,如果你想把键映射到已经存在的值,会抛出 IllegalArgumentException 异常。如果对特定值,你想要强制替换它的键,请使用 BiMap.forcePut(key, value)。