不可变集合Immutable

本文介绍了不可变集合的概念及优势,包括其在多线程环境下的安全性、节省资源等特性,并展示了如何在Java中使用Guava库创建不可变集合的具体实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

不可变集合,集合是不可变的,不可修改的。集合的数据项是在创建的时候提供,并且在整个生命周期中不可以改变。

为什么要用immutable对象?immutable对象有以下的优点:
    1.对不可靠的客户代码库来说,它使用安全,可以在未受信任的类库中安全的使用这些对象
    2.线程安全的:immutable对象在多线程下安全,没有竞态条件
    3.不需要支持可变性, 可以尽量节省空间和时间的开销. 所有的不可变集合实现都比可变集合更加有效的利用内存 (analysis)
    4.可以被使用为一个常量,并且期望在未来也是保持不变的

immutable对象可以很自然地用作常量,因为它们天生就是不可变的对于immutable对象的运用来说,它是一个很好的防御编程(defensive programming)的技术实践。

JDK中实现immutable集合

 JDK也提供了Collections.unmodifiableXXX方法把集合包装为不可变形式,但我们认为不够好:

  • 笨重而且累赘:不能舒适地用在所有想做防御性拷贝的场景;
  • 不安全:要保证没人通过原集合的引用进行修改,返回的集合才是事实上不可变的;
  • 低效:包装过的集合仍然保有可变集合的开销,比如并发修改的检查、散列表的额外空间,等等。

重要提示:所有Guava不可变集合的实现都不接受null值

使用不可变集合

1.copyOf方法,

@Test
public void test4(){
    Set<String> set=new HashSet<String>();
    set.add("we");
    set.add("are");
    set.add("hello");
    ImmutableSet<String> strings = ImmutableSet.copyOf(set);
    System.out.println(strings.asList());
}

结果

[are, hello, we]


2.Of方法,ImmutableSet.of(“a”, “b”, “c”)

@Test
public void test5(){
    final ImmutableSet<String> immutableSet = ImmutableSet.of("we""are""happy");
    System.out.println(immutableSet);
}


3.Builder工具,如

@Test
public void test6(){
    ImmutableSet<Object> build = ImmutableSet.builder().add("we").add("are").add("happy").build();
    System.out.println(build);
}

asList视图

所有不可变集合都有一个asList()方法提供ImmutableList视图,来帮助你用列表形式方便地读取集合元素。例如,你可以使用sortedSet.asList().get(k)从ImmutableSortedSet中读取第k个最小元素。

asList()返回的ImmutableList通常是——并不总是——开销稳定的视图实现,而不是简单地把元素拷贝进List。也就是说,asList返回的列表视图通常比一般的列表平均性能更好,比如,在底层集合支持的情况下,它总是使用高效的contains方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值