Google-Guava学习:不可变集合

不可变对象有很多优点,包括:

  • 当对象被不可信的库调用时,不可变形式是安全的;
  • 不可变对象被多个线程调用时,不存在竞态条件问题
  • 不可变集合不需要考虑变化,因此可以节省时间和空间。所有不可变的集合都比它们的可变形式有更好的内存利用率(分析和测试细节);
  • 不可变对象因为有固定不变,可以作为常量来安全使用。

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

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

示例如下(ImmutableSet):

package com.cyq.test;

import java.awt.Color;
import java.util.Arrays;
import java.util.List;

import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedSet;
import com.google.common.collect.UnmodifiableIterator;

/**
 * @author cyq
 *
 */
public class ImmutableSetTest {

	public ImmutableSetTest() {
		//构造方法一: copyOf方法
		List<String> list=Arrays.asList("1","3","2");
		ImmutableSet<String> immutableSet1 = ImmutableSet.copyOf(list);
		immutableSet1.forEach(System.out::println);
		System.out.println("-----------------------");
		//构造方法二: of方法
		ImmutableSet<String> immutableSet2 = ImmutableSet.of("a", "c", "b");
		immutableSet2.forEach(System.out::println);
		System.out.println("-----------------------");
		//构造方法三: Builder工具
		ImmutableSet<Color> immutableSet3 =	ImmutableSet.<Color>builder()
				.add(new Color(0, 191, 255))
				.add(new Color(12, 191, 255))
				.add(new Color(14, 191, 255))
				.build();
		immutableSet3.forEach(System.out::println);
		System.out.println("-----------------------");

		//此外,对有序不可变集合来说,排序是在构造集合的时候完成的,如:
		ImmutableSortedSet<String> sortedSet = ImmutableSortedSet.of("a", "c", "b", "a", "d", "b");
		UnmodifiableIterator<String> iterator = sortedSet.iterator();
		while(iterator.hasNext()){
			System.out.println(iterator.next());//a, b, c, d
		}
	}
	
	public static void main(String[] args) {
		
		new ImmutableSetTest();
	}
}

关联可变集合和不可变集合:

可变集合接口属于JDK还是Guava不可变版本
CollectionJDKImmutableCollection
ListJDKImmutableList
SetJDKImmutableSet
SortedSet/NavigableSetJDKImmutableSortedSet
MapJDKImmutableMap
SortedMapJDKImmutableSortedMap
MultisetGuavaImmutableMultiset
SortedMultisetGuavaImmutableSortedMultiset
MultimapGuavaImmutableMultimap
ListMultimapGuavaImmutableListMultimap
SetMultimapGuavaImmutableSetMultimap
BiMapGuavaImmutableBiMap
ClassToInstanceMapGuavaImmutableClassToInstanceMap
TableGuavaImmutableTable

无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家。教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家。点这里可以跳转到教程。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值