Guava ImmutableCollection简介

ImmutableCollection代码定义

@GwtCompatible(emulated=true)
public abstract class ImmutableCollection<E> extends AbstractCollection<E> 
        implements Serializable

ImmutableCollection表示内容不可更改的集合,并提供以下额外特性的担保。

注意:应当避免直接使用ImmutableCollection作为一个类型,就如同避免直接使用Collection本身一样。最好使用其子类(例如ImmutableSet或ImmutableList),因为子类拥有更好的Object.equals(java.lang.Object) 语义,可以从源头避免常见的bug和错误。

以下文档适用于com.google.common.collect包中所有公开的不可变类型,不论是否是ImmutableCollection的子类。

保证特性

  • 浅不可变

浅不可变是指值是不可写的,但是如果是对象的引用的值是可被改变的。不能对不可变集合的元素进行增加、移除或者替换。这是比Collections.unmodifiableCollection 更严格的保证,因为这个集合的内容会随其包装集合的改变而改变。

  • 不可为Null

本集合不能包含null元素。

  • 确定性的迭代

元素迭代顺序是被定义的,取决于集合的创建(细节可以参考对应的工厂方法)。除非另外注明,集合视图(例如ImmutableMultiset.elementSet())的迭代顺序与父集合一样。

  • 线程安全

多线程并发访问集合是安全的。

  • 完整性

本类型不能在除com.google.common.collect包以外被继承。(因为这有可能违反以上担保特性。)

接口而非实现

每一个公开的类(例如ImmutableSet)都是一个提供具体功能行为保证的类型,而不仅仅是在某种特定的实现(例如ArrayList)。对类型名称的含义都应当理解为是接口而非实现。

属性类型和方法返回类型通常都应当使用不可变类型(例如ImmutableList)而不是一般的集合接口(例如List)。这样便于告知调用者以上对于类型的保证特性,这是非常有用的信息。

另一方面,直接将ImmutableList作为参数类型并不令人满意。解决方案是接受Iterable类型参数,通过方法或构造器将它传递给相应的copyOf方法。

创建

除了逻辑层面的抽象类(例如ImmutableCollection),每个不可变类型都提供了或者此类型实例的静态方法。最常用的有:
1、静态方法of,接受一个显示的元素或条目列表。
2、静态方法copyOf(或者copyOfSorted),接受一个内容可被复制的已存在的集合。
3、嵌套的静态类Builder,它可以用来填充一个新的不可变实例。

警告

如任何集合一样,改变集合中的元素(这种改变影响了Object.equals(java.lang.Object)的行为)是一种错误的做法。他会引起未定义的行为和bug。通常最佳实践是完全避免使用可变对象作为集合元素,虽然许多用户认为不可变对象是深不可变的(deeply immutable)。

性能说明

1、集合的实现通常优先考虑内存效率,然后是访问速度,最后是创建速度。
2、copyOf方法有时会认为没有必要进行实际复制操作:例如,copyOf(copyOf(anArrayList))只会复制一次。这减少了在API边界习惯性地创建防御副本的代价。但是,跳过拷贝操作的精确情况是未定义的。
3、警告:视图集合(例如ImmutableMap.keySet或ImmutableList.subList(int,int))会保留对整个数据集合的引用,以防止其被垃圾收集。如果其中一些数据通过其他方式不再可用,这可能会产生内存泄漏。可通过传递视图集合给适当的copyOf方法以获得正确大小的拷贝。
4、与创建可变集合并拷贝相比,使用相应关联的Builder类并不会降低性能,有可能会更好。
5、通常实现不会缓存hash code。如果元素或键类型的hashCode实现较慢,它应当自己实现缓存。

使用示例


   class Foo {
     private static final ImmutableSet<String> RESERVED_CODES =
         ImmutableSet.of("AZ", "CQ", "ZX");

     private final ImmutableSet<String> codes;

     public Foo(Iterable<String> codes) {
       this.codes = ImmutableSet.copyOf(codes);
       checkArgument(Collections.disjoint(this.codes, RESERVED_CODES));
     }
   }
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值