您的位置:首页 > 其它

Immutable(不可变)集合

2016-02-26 16:15 246 查看
       immutable不可变集合,即集合是不可被修改的。

       对于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]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: