guava中集合(5)

159 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 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的新集合、工具可以简单优雅的实现一些复杂的数据结构,让我们花更多精力在业务上,而不是在数据结构和数据处理上。