本文小编为大家详细介绍“Java核心工具库Guava如何使用”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java核心工具库Guava如何使用”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。不可变集合的特性有:在多线程操作下,是线程安全的;所有不可变集合会比可变集合更有效的利用资源;中途不可改变。如果你的需求是想创建一个一经初始化后就不能再被改变的集合那么它适合你,因为这些工具类根本就没给你提供修改的 API,这意味着你连犯错误的机会都没有。以上 Immutable 开头的相关集合类的 add、remove 方法都被声明为 deprecated。当你手误点到了这些方法发现是 deprecated 的时候你不会还想着使用吧。注意:每个Guava immutable集合类的实现都拒绝 null 值。有趣的集合我们映像中的 Set 应该是无序的,元素不可重复的。MultiSet 颠覆了三观,因为它可以重复。定义一个 MultiSet 并添加元素:你还可以添加指定个数的同一个元素:这表示你想添加 3 个 7。打印出来的 MultiSet 也很有意思:2个3,2个4,一个5,3个7。获取某个元素的个数:这个工具类确实很有意思,帮我们实现了 word count。这个 map 也很有意思。正常的 map 为了区分不同的 key,它倒好,直接给你来一样的 key 。使用很简单,用一个 key 可以获取到该 key 对应的两个值,结果用 list 返回。恕我无知,我还没想到这个 map 能够使用的场景。Multimap 提供了多种实现:(Bidirectional Map) 键与值都不能重复这个稍稍正常一点。如果 key 重复了则会覆盖 key ,如果 value 重复了则会报错。上面的示例中键 ”key“ 有两个,运行可以发现 get 的时候会用 ”haha1″ 覆盖 ”haha“,另外 value 为 ”haha“ 也有两个,你会发现运行上面的代码不会报错,这是因为 ”key“ 对应的 value 已经被 “haha1” 覆盖了。否则是会报错。双键的 map ,我突然感觉我发现了新大陆。比如我有一个业务场景是:根据职位和部门将公司人员区分开来。key 可以用职位 + 部门组成一个字符串,那我们有了双键 map 之后就没这种烦恼。JDK里大家耳熟能详的是Collections
这个集合工具类, 提供了一些基础的集合处理转换功能, 但是实际使用里很多需求并不是简单的排序, 或者比较数值大小, 然后 Guava 在此基础上做了许多的改进优化, 可以说是 Guava 最为成熟/流行的模块之一。数组相关:Lists集合相关:Setsmap 相关:MapsJoiner 做为连接符的使用非常简单,下例是将 list 转为使用连接符连接的字符串:将 map 转为自定义连接符连接的字符串:分隔符 Splitter 的使用也很简单:如果字符串中带有空格,还可以先去掉空格:将 String 转为 map:Java 提供了 Comparator 可以用来对对象进行排序。Guava 提供了排序器 Ordering 类封装了很多实用的操作。Ordering 提供了一些有用的方法:natural() 对可排序类型做自然排序,如数字按大小,日期按先后排序usingToString() 按对象的字符串形式做字典排序[lexicographical ordering]from(Comparator) 把给定的Comparator转化为排序器reverse() 获取语义相反的排序器nullsFirst() 使用当前排序器,但额外把null值排到最前面。nullsLast() 使用当前排序器,但额外把null值排到最后面。compound(Comparator) 合成另一个比较器,以处理当前排序器中的相等情况。 lexicographical() 基于处理类型T的排序器,返回该类型的可迭代对象Iterable的排序器。
onResultOf(Function) 对集合中元素调用Function,再按返回值用当前排序器排序。示例:build 的 gender 大于 build1 的,所以返回 -1,反之返回 1。Stopwatch 类提供了时间统计的功能,相当于帮你封装了调用 System.currentTimeMillis() 的逻辑。Guava Cache 在日常的使用中非常地频繁,甚至都没有意识到这是第三方提供的工具类而是把它当成了 JDK 自带的实现。设置本地缓存使用 CacheBuilder.newBuilder(),支持设置缓存大小,缓存过期时间,缓存刷新频率等等。如果你想统计缓存的命中率, Guava Cache 也提供了这种能力帮你汇总当前缓存是否有效。同时缓存如果因为某种原因未自动刷新或者清除,Guava Cache 也支持用户手动调用 API 刷新或者清除缓存。常用的限流算法有 漏桶算法、令牌桶算法。这两种算法各有侧重点:漏桶算法:漏桶的意思就像一个漏斗一样,水一滴一滴的滴下去,流出是匀速的。当访问量过大的时候这个漏斗就会积水。漏桶算法的实现依赖队列,一个处理器从队头依照固定频率取出数据进行处理。如果请求量过大导致队列堆满那么新来的请求就会被抛弃。漏桶一般按照固定的速率流出。令牌桶则是存放固定容量的令牌,按照固定速率从桶中取出令牌。初始给桶中添加固定容量令牌,当桶中令牌不够取出的时候则拒绝新的请求。令牌桶不限制取出令牌的速度,只要有令牌就能处理。所以令牌桶允许一定程度的突发,而漏桶主要目的是平滑流出。RateLimiter 使用了令牌桶算法,提供两种限流的实现方案:平滑突发限流(SmoothBursty)平滑预热限流(SmoothWarmingUp)实现平滑突发限流通过 RateLimiter 提供的静态方法来创建:设置每秒放置的令牌数为 5 个,基本 0.2s 一次符合每秒 5 个的设置。保证每秒不超过 5 个达到了平滑输出的效果。在没有请求使用令牌桶的时候,令牌会先创建好放在桶中,所以此时如果突然有突发流量进来,由于桶中有足够的令牌可以快速响应。RateLimiter 在没有足够令牌发放时采用滞后处理的方式,前一个请求获取令牌所需等待的时间由下一次请求来承受。平滑预热限流并不会像平滑突发限流一样先将所有的令牌创建好,它启动后会有一段预热期,逐步将分发频率提升到配置的速率。比如下面例子创建一个平均分发令牌速率为 2,预热期为 3 分钟。由于设置了预热时间是 3 秒,令牌桶一开始并不会 0.5 秒发一个令牌,而是形成一个平滑线性下降的坡度,频率越来越高,在 3 秒钟之内达到原本设置的频率,以后就以固定的频率免费云主机域名输出。这种功能适合系统刚启动需要一点时间来“热身”的场景。从上面的输出看前面两次获取令牌都很耗时,往后就越来越趋于平稳。读到这里,这篇“Java核心工具库Guava如何使用”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注百云主机行业资讯频道。
这篇文章主要讲解了“Java怎么实现客户信息管理系统”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java怎么实现客户信息管理系统”吧!Customer类:CustomerList 类:CustomerVIew…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。