Guava 基础

作者: Tinyspot | 来源:发表于2023-01-31 10:58 被阅读0次

    1. 基础

    1.1 guava的核心库

    • 集合 [Collections]
    • 缓存[Caches]
    • 原生类型支持 [primitives]
    • 并发[Concurrency]
    • 字符串处理[Strings]
    • I/O 等

    1.2 依赖

    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>31.1-jre</version>
    </dependency>
    

    2. 集合工具(Collections)

    2.1 不可变集合

    • Guava 不可变集合都不接受 null 值
    // 普通Collection的创建
    List<String> list = Lists.newArrayList();
    Set<String> set = Sets.newHashSet();
    Map<String, String> map = Maps.newHashMap();
    
    // 不变Collection的创建
    ImmutableList<String> iList = ImmutableList.of("a", "b", "c");
    ImmutableSet<String> iSet = ImmutableSet.of("a", "b");
    ImmutableMap<String, String> iMap = ImmutableMap.of("k1", "v1", "k2", "v2");
    

    immutable(不可变)对象

    • 线程安全
    • 创建对象的不可拷贝

    2.2 Multimap

    • Multimap 是一键对多值的HashMap,类似于 Map<K, List>
    @Test
    public void test() {
        Multimap<String, String> multimap = ArrayListMultimap.create();
        multimap.put("name", "aaa");
        multimap.put("name", "aaa");
        multimap.put("name", "bbb");
        multimap.put("code", "1001");
        // {code=[1001], name=[aaa, aaa, bbb]}
        System.out.println(multimap);
        System.out.println(multimap.get("name"));
    }
    

    2.3 Multiset

    • 集合[set]概念的延伸,它的元素可以重复出现
    • 元素无序
    @Test
    public void test() {
        Multiset<String> multiset = HashMultiset.create();
        multiset.add("aaa");
        multiset.add("aaa");
        multiset.add("bbb");
        System.out.println(multiset.count("aaa"));
    }
    

    2.4 BiMap

    • put(K key, V value):添加新的键值,若值有重复,会抛出异常
    • forcePut(K key, V value) 若值重复,强制替换
    @Test
    public void test() {
        BiMap<String, String> biMap = HashBiMap.create();
        biMap.put("name", "aaa");
        // java.lang.IllegalArgumentException: value already present
        biMap.put("other", "aaa");
    }
    

    值重复时会抛异常,
    IllegalArgumentException – if the given value is already bound to a different key in this bimap
    改为 biMap.forcePut("other", "aaa");

    3. 缓存

    • Guava Cache 是将数据缓存到JVM内存

    3.1 缓存分类

    • 本地缓存
      • 本地缓存会占用JVM内存
      • 本地缓存为了保证线程安全问题,一般使用ConcurrentMap的方式保存在内存之中
    • 分布式缓存
      • 分布式缓存的开销则在于网络时延和对象序列化,故主要影响调用时延
      • 分布式缓存常见的有 Redis,MongoDB

    3.2 CacheBuilder生成器

    @Test
    public void test() {
        Cache<String,String> cache = CacheBuilder.newBuilder()
                .maximumSize(1024)
                .expireAfterWrite(60, TimeUnit.SECONDS)
                .weakValues() .build();
    
        cache.put("greet","Hello Guava Cache");
        System.out.println(cache.getIfPresent("greet"));
    }
    

    3.3 缓存清除策略

    • 基于存活时间的清除策略
      • expireAfterWrite 写缓存
      • expireAfterAccess 读写缓存
    • 基于容量的清除策略
      • CacheBuilder.maximumSize(long)
    • 基于权重的清除策略
      • CacheBuilder.weigher(Weigher)指定一个权重函数
      • CacheBuilder.maximumWeight(long)指定最大总重

    相关文章

      网友评论

        本文标题:Guava 基础

        本文链接:https://www.haomeiwen.com/subject/vfwvhdtx.html