一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第15天,点击查看活动详情。
4、不可变集合
JDK也提供了Collections.unmodifiableXXX方法把集合包装为不可变形式,这种情况存在一些缺点:
- 笨重而且累赘:不能舒适地用在所有想做防御性拷贝的场景;
- 不安全:要保证没人通过原集合的引用进行修改,返回的集合才是事实上不可变的;
- 低效:包装过的集合仍然保有可变集合的开销,比如并发修改的检查、散列表的额外空间,等等。
guava的不可变集合主要基于两种方式创建
- ImmutableXXX.of();
- ImmutableXXX.copyOf();
所有Guava不可变集合的实现都不接受null值
代码示例
// JDK实现
List<String> list=new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
System.out.println(list);
List<String> unmodifiableList=Collections.unmodifiableList(list);
System.out.println("unmodifiableList---》初始化---》"+unmodifiableList);
List<String> unmodifiableList1=Collections.unmodifiableList(Arrays.asList("a","b","c"));
System.out.println(unmodifiableList1);
String temp=unmodifiableList.get(1);
System.out.println("unmodifiableList [0]:"+temp);
list.add("baby");
System.out.println("list add a item after list:"+list);
System.out.println("list add a item after unmodifiableList:"+unmodifiableList);
unmodifiableList1.add("bb");
System.out.println("unmodifiableList add a item after list:"+unmodifiableList1);
// guava实现
List<String> list=new ArrayList<String>();
list.add("a");
list.add("b");
list.add("c");
System.out.println("list:"+list);
ImmutableList<String> imlist=ImmutableList.copyOf(list);
System.out.println("imlist:"+imlist);
ImmutableList<String> imOflist=ImmutableList.of("peida","jerry","harry");
System.out.println("imOflist:"+imOflist);
ImmutableSortedSet<String> imSortList=ImmutableSortedSet.of("a", "b", "c", "a", "d", "b");
System.out.println("imSortList:"+imSortList);
list.add("baby");
System.out.println("list add a item after list:"+list);
System.out.println("list add a item after imlist:"+imlist);
// imlist.add("hello");
// System.out.println("list add a item after imlist:"+imlist);
5、自然排序新姿势
jdk中自然排序需要实现Comparable接口。 guava提供了一个构造Comparable实体的工具类com.google.common.collect.Ordering
List<Integer> list = Arrays.asList(1, 5, 3, 8, 2);
System.out.println(list);
Collections.sort(list);
// [1, 2, 3, 5, 8]
System.out.println(list);
// list = Arrays.asList(1, 5, null, 3, 8, 2);
// null 排序异常
// Collections.sort(list);
// System.out.println(list);
list = Arrays.asList(1, 5, null, 3, 8, 2);
// [null, 1, 2, 3, 5, 8]
Collections.sort(list, Ordering.natural().nullsFirst());
System.out.println(list);
list = Arrays.asList(1, 5, null, 3, 8, 2);
// [1, 2, 3, 5, 8, null]
Collections.sort(list, Ordering.natural().nullsLast());
System.out.println(list);
list = Arrays.asList(1, 5, 3, 8, 2);
// [8, 5, 3, 2, 1]
Collections.sort(list, Ordering.natural().reverse());
System.out.println(list);
相信上面有些场景,大家都遇见过,甚至自己实现过。guava的新集合、工具可以简单优雅的实现一些复杂的数据结构,让我们花更多精力在业务上,而不是在数据结构和数据处理上。