Immutable(不可变)集合
2016-02-26 16:15
246 查看
immutable不可变集合,即集合是不可被修改的。
对于immutable对象,它是线程安全的,在多线程下安全,没有竞态条件,而且由于不需要支持可变性, 可以尽量节省空间和时间的开销. 所有的不可变集合实现都比可变集合更加有效的利用内存。
在JDK中提供了Collections.unmodifiableXXX系列方法来实现不可变集合, 但是存在一些问题。
Guava的immutable集合
Guava immutable集合类的实现拒绝null值,如果需要能接受null值的集合类,请使用Collections.unmodifiableXXX。
Immutable集合创建方式:
1. copyOf方法,ImmutableSet.copyOf(set)。
2.of方法, ImmutableSet.of("a", "b", "c") 或 ImmutableMap.of("a", 1, "b", 2)。
3.使用Builder类。
对于immutable对象,它是线程安全的,在多线程下安全,没有竞态条件,而且由于不需要支持可变性, 可以尽量节省空间和时间的开销. 所有的不可变集合实现都比可变集合更加有效的利用内存。
在JDK中提供了Collections.unmodifiableXXX系列方法来实现不可变集合, 但是存在一些问题。
List<String> list = new ArrayList<String>(); list.add("a"); list.add("b"); System.out.println("list = " + list); List<String> unmodifiableList = Collections.unmodifiableList(list); System.out.println("unmodifiableList = " + unmodifiableList); String temp = unmodifiableList.get(0); System.out.println("unmodifiableList.get(0) = " + temp); list.add("d"); System.out.println("after add to list, the list = " + list); System.out.println("after add to list, the unmodifiableList = " + unmodifiableList); try { unmodifiableList.add("e"); } catch (UnsupportedOperationException e) { System.out.println("unmodifiableList1 add item error. " + e); } //Arrays.asList("a", "b", "c"), 注意这里的List是Array$ArrayList,不支持add、remove,相当于immutable List<String> unmodifiableList1 = Collections.unmodifiableList(Arrays.asList("a", "b", "c", "d")); System.out.println(unmodifiableList1); try { unmodifiableList1.add("e"); } catch (UnsupportedOperationException e) { System.out.println("unmodifiableList1 add item error. " + e); }运行结果:
list = [a, b] unmodifiableList = [a, b] unmodifiableList.get(0) = a after add to list, the list = [a, b, d] after add to list, the unmodifiableList = [a, b, d] unmodifiableList1 add item error. java.lang.UnsupportedOperationException [a, b, c, d] unmodifiableList1 add item error. java.lang.UnsupportedOperationException可以看出Collections.unmodifiableList并不是真正的不可变集合,当原始集合修改后,不可变集合也发生变化。不可变集合不可以修改集合数据,当强制修改时会报错UnsupportedOperationException异常。Collections.unmodifiableXX返回的数据结构本质仍旧是原来的集合类,那么它的操作开销,包括并发下修改检查,hash table里的额外数据空间都和原来的集合是一样的。
Guava的immutable集合
Guava immutable集合类的实现拒绝null值,如果需要能接受null值的集合类,请使用Collections.unmodifiableXXX。
Immutable集合创建方式:
1. copyOf方法,ImmutableSet.copyOf(set)。
2.of方法, ImmutableSet.of("a", "b", "c") 或 ImmutableMap.of("a", 1, "b", 2)。
3.使用Builder类。
List<String> list = new ArrayList<String>(); list.add("a"); list.add("b"); System.out.println("list = " + list); ImmutableList<String> immutablelist = ImmutableList.copyOf(list);//推荐使用此方式 System.out.println("immutablelist = " + immutablelist); list.add("t"); System.out.println("after add to list, the list =" + list); System.out.println("after add to list, the immutablelist =" + immutablelist); ImmutableList<String> immutablelist02 = ImmutableList.of("q", "w", "e"); System.out.println("immutablelist02 = " + immutablelist02); ImmutableSortedSet<String> immutableSortSet = ImmutableSortedSet.of("a", "b", "c", "a", "b"); System.out.println("immutableSortSet = " + immutableSortSet); ImmutableSet<String> immutablelist03 = ImmutableSet.<String> builder().add("q").add("t").build(); System.out.println("imnutablelist03:" + immutablelist03);运行结果:
list = [a, b] immutablelist = [a, b] after add to list, the list =[a, b, t] after add to list, the immutablelist =[a, b] immutablelist02 = [q, w, e] immutableSortSet = [a, b, c] imnutablelist03:[q, t]
相关文章推荐
- Apple Pay编程指导
- 阿里云服务器Web项目配置发布全过程
- VMware+CentOS+zookeeper+solr集群环境搭建_org.apache.solr.handler.dataimport.DataImportHandler
- VMware+CentOS+zookeeper+solr集群环境搭建_org.apache.solr.handler.dataimport.DataImportHandler
- jquery.fileupload.js插件使用--前两篇日志中两个类的使用示例
- 性能优化
- Soldier and Badges
- Python学习笔记 - 7.列表(List)
- JVM内幕:Java虚拟机详解
- 浅谈Linux下的五种I/O模型
- hadoop生态圈综合简介及架构案例
- Python PEP8代码风格
- Ubuntu更新源
- Type mismatch: cannot convert from Test to Annotation
- 如何让导航条高亮显示
- Android由web页打开自己的app
- Python学习笔记 - 6.文件
- HDU3555 要49 数位DP
- Java中建造者(Builder)设计
- 欢迎使用CSDN-markdown编辑器