Immutable(不可变)集合


       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]


asList视图

       asList方法是在ImmutableCollection中定义,而所有的不可变集合都会从ImmutableCollection继承,所以所有的不可变集合都会有asList()方法返回当前不可变集合的list视图,这个视图也是不可变的。因此所有不可变集合都可以用asList()方法来获得ImmutableList视图,来帮助我们用列表形式方便地读取集合元素。例如,你可以使用sortedSet.asList().get(k)从ImmutableSortedSet中读取第k个最小元素。
       asList()返回的ImmutableList通常是——并不总是——开销稳定的视图实现,而不是简单地把元素拷贝进List。也就是说,asList返回的列表视图通常比一般的列表平均性能更好。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值