继续浏览精彩内容
慕课网APP
程序员的梦工厂
打开
继续
感谢您的支持,我会继续努力的
赞赏金额会直接到老师账户
将二维码发送给自己后长按识别
微信支付
支付宝支付

google guava的不可变集合

一只斗牛犬
关注TA
已关注
手记 493
粉丝 49
获赞 300

不可变集合的意义

不可变对象有很多优点,包括:

  • 当对象被不可信的库调用时,不可变形式是安全的;

  • 不可变对象被多个线程调用时,不存在竞态条件问题

  • 不可变集合不需要考虑变化,因此可以节省时间和空间。所有不可变的集合都比它们的可变形式有更好的内存利用率(分析和测试细节);

  • 不可变对象因为有固定不变,可以作为常量来安全使用。

创建对象的不可变拷贝是一项很好的防御性编程技巧。Guava为所有JDK标准集合类型和Guava新集合类型都提供了简单易用的不可变版本。
 JDK也提供了Collections.unmodifiableXXX方法把集合包装为不可变形式,但我们认为不够好:

  • 笨重而且累赘:不能舒适地用在所有想做防御性拷贝的场景;

  • 不安全:要保证没人通过原集合的引用进行修改,返回的集合才是事实上不可变的;

  • 低效:包装过的集合仍然保有可变集合的开销,比如并发修改的检查、散列表的额外空间,等等。

如果你没有修改某个集合的需求,或者希望某个集合保持不变时,把它防御性地拷贝到不可变集合是个很好的实践。

重要提示:所有Guava不可变集合的实现都不接受null值。我们对Google内部的代码库做过详细研究,发现只有5%的情况需要在集合中允许null元素,剩下的95%场景都是遇到null值就快速失败。如果你需要在不可变集合中使用null,请使用JDK中的Collections.unmodifiableXXX方法。更多细节建议请参考“使用和避免null”

如何使用guava的不可变集合

1. 如何创建不可变集合

第一种方法使用builder创建:

public class ImmutableDemo {    public static void main(String[] args) {        Set<String> immutableNamedColors = ImmutableSet.<String>builder()                .add("red", "green","black","white","grey")                .build();        //immutableNamedColors.add("abc");        for (String color : immutableNamedColors) {            System.out.println(color);        }    }}

第二种方法使用of静态方法创建:

        ImmutableSet.of("red","green","black","white","grey");

第三种方法使用copyOf静态方法创建:

        ImmutableSet.copyOf(new String[]{"red","green","black","white","grey"});

2. 使用asList()获得不可变集合的list视图

asList方法是在ImmutableCollection中定义,而所有的不可变集合都会从ImmutableCollection继承,所以所有的不可变集合都会有asList()方法返回当前不可变集合的list视图,这个视图也是不可变的。

3. 不可变集合的使用

不可变集合的使用和普通集合一样,只是不能使用他们的add,remove等修改集合的方法。

原文链接:http://outofmemory.cn/java/guava/Collections/Immutable

打开App,阅读手记
0人推荐
发表评论
随时随地看视频慕课网APP