选择您的收藏库

这真的是您应该烦恼的吗? java.util.ArrayListjava.util.HashMap从根本上有问题吗? 对于大多数源代码,答案是–不; 这些实现完全可以。 但是,一如既往,细节决定成败。 并存在情况下,当是内置到功能设置集合API不够充分,或者您找到标准的集合设置成开销太高了您的喜好。

在过去的几年中,我们不断地发现了同样的问题。 并且认为分享经验会很好–希望它可以节省一两天的时间。 通过避免另一种双向Map实现或理解为什么他的HashSet消耗的内存比预期多10倍来实现。

我们已将评论分为两个不同的集合库组。 首先,它们为标准Collections API提供了其他功能。 在这个小组中,我们有Guava和Apache Commons Collections这样的玩家。 另一组Collection库可以在某些方面发挥作用。 在这个小组中,我们看到诸如Trove,fastutil和Huge Collections之类的库。 我们从添加功能的库开始概述,然后进入面向性能的环境。

集合API

每个Java开发人员都应该熟悉的真正基本的API之一。 但是,至少每个月一次,我们会碰到一个真正有创造力或者只是不习惯于熟悉Collections API的人编写的代码。

因此,如果当ArrayList更合适或者不了解TreeSetTreeMap之间的区别时,您的任何一个同事也正在使用Vector,那么Janeve George就整个API进行了很好的概述 ,并解释了何时使用哪种类型的Collections。 。

引用我们今天所知道的Collections API的起源也很好。 Collections API中可用的大多数抽象,结构和功能最初都是由Doug Lea在其collections包中设计的。

番石榴

Guava是Google的前身,它是在多个Google产品中使用的一组库。 该库的重要部分专用于馆藏。 例如,您需要时就应该查看番石榴:

  • 100%线程安全的集合–签出ImmutableCollections
  • 轻松计算集合中特定元素的出现次数– MultiSet和SortedMultiSet可以节省您的一天。
  • 想要实现未标记的有向图? Multimap是您最好的朋友。
  • 是否需要实现一个键和值都唯一且都应可用作搜索值的键的映射? 番石榴的双向地图将帮助您。

…还有更多有趣且有用的实现,您可以从项目的主页中检出。

Apache Commons集合

Commons Collections由多个Apache项目使用,如果您需要其他功能,例如Commons Collections,它是一个不错的附加组件:

  • FIFO / LIFO实现–查看“ 队列和缓冲区”
  • 一个集合可以保留同一元素的多个副本? 放进袋里 实施。
  • 一个Map,其中元素按特定顺序排列,但未根据键的compareTo()进行排序-解决方案以OrderedMap的形式提供。

为了使本文的字符数保持在30,000个以内,我将不介绍所有优点,但是我可以验证Apache Commons Collections项目中还有很多不错的实用程序和工具。

宝库

如果您保存在集合中的只是数字,那么Trove可能会帮助您提高性能并减少内存开销。 Trove是一组收集类,专门用于保存原语。 如果您还记得的话,它们消耗的内存比对象包装对象少。

快速测试表明,在较大的collection上,Trove实现所需的堆至少比标准Java Collection实现少三倍。 如果您认为这是无关紧要的开销,则在32位计算机上,包含100,000个整数的Map使用java.util.HashMap需要6.3MB的堆,而使用Trove则需要1.8MB的堆。 现在,从包含数以千万计的元素的集合来看,已经开始有意义。

与Trove相当的东西,即Apache Commons Primitives和Java的Primitive Collections似乎都被放弃了。 这两种情况的最新版本都始于2003年。

大量收藏

如果您要消除的痛点与旧一代中收集到的大型集合导致的长时间GC暂停有关,则应查看Huge Collections 。 它们完全将内容保留在堆外,因此几乎完全不影响垃圾收集。 从下面的数据集可视化中可以看出,作者正在发布用在GC上的数字,这些数字在数据结构上具有不同的大小:

Huge Collection GC timing

高度可扩展的Java

需要锁定不重要的解决方案吗? 是否需要在具有数十个或数百个内核的环境中使用数据结构? 然后为您创建了高度可扩展的Java 。 感谢Cliff Click对此。

fastutil

需要工作与超过2 ^ 31个元素真正的大集合? 查看fastutil –它为您提供了与这些野兽一起工作的数据结构。 从历史上看,这个问题并不是什么大问题。 为什么-因为我们没有这么大的数据结构。 而且在极少数情况下,我们确实有这种大小的结构,在API本身施加2 ^ 31的限制之前,我们会遇到RAM限制。 因此,在那种情况下,我们改为创建一个包含100亿个百万元素的单一集合。

其他

无论如何,本节最后的图书馆比(引起关注的)图书馆要糟糕得多。 只是这些是我们还没有机会在实践中尝试的Collections。 至少直到本文发表为止。 但是,由于我们的读者,我们得到了一些提示,并在1月9 发布了已发表的文章部分:

Javolution –使用Javolution集合的主要原因是它们具有时间确定性(最大执行时间非常接近最小执行时间),并且它们是RTSJ-Safe。 因此,如果您要编写硬性或软性实时应用程序,并且必须处理执行期限和CPU时间预算,请进行检查 。

高盛收藏 。 您可能喜欢或可能不喜欢投资银行业务,但是GS Collections背后的概念肯定很有趣。 该库为常用操作添加了许多便利方法,否则需要您编写Iterators和匿名类。 还有一种说法是,GS集合还消耗更少的CPU周期和堆。 自2005年以来的图书馆显然已经使用了高盛的内部应用程序和我们渴望通过尝试一下自己 。 图书馆还随附了GS Collections Kata项目中包装好的实用培训材料。

摘要

正如我们文章中经常发生的那样-在您手头的95%的问题中,此处介绍的库除了使您的设置复杂之外,不会添加任何其他内容。 但是在极少数情况下,当您需要其他功能或需要挤出最后的性能时–熟悉环境非常好。 在自己编写半熟的解决方案之前,请做出明智的选择。

完全免责声明:在熟悉所有上述解决方案之后,由于与性能相关的各种原因,我们仍然最终构建了自己的解决方案。 但是,通常情况下,作为–javaagent来跟踪所有对象的创建和销毁,您并不一定会受到性能的限制,并且可能会产生更多开销。 在这种情况下,您可以尝试现有的解决方案,而不是从头开始构建自己的解决方案,从而可能会更好。

参考:从我们的JCG合作伙伴 Vlumimir Sor(位于Plumbr博客)中 选择您的收藏库 。

翻译自: https://www.javacodegeeks.com/2013/01/selecting-your-collections-library.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/370150.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

里公式后面标号怎么对齐_你若会用Word里F4键,又何须加班到半夜?

F4键在Word里面表示重复上一个操作,但对于这个快捷键,你真的会操作吗?本期与大家分享这个神奇的F4键,助你高效工作。1、批量复制文本在一般情况下,我们是用CtrlC复制内容,CtrlV粘贴内容,但遇到特…

DshanMCU-R128s2 SDK 架构与目录结构

R128 S2 是全志提供的一款 M33(ARM)C906(RISCV-64)HIFI5(Xtensa) 三核异构 SoC,同时芯片内部 SIP 有 1M SRAM、8M LSPSRAM、8M HSPSRAM 以及 16M NORFLASH。 本文档作为 R128 FreeRTOS SDK 开发指南,旨在帮助软件开发工程师、技术支持工程师快速上手&am…

数据导出

数据导出和数据导入刚好是相反的,把逻辑反过来就可以了。 源码:https://github.com/SeaLee02/FunctionModule/blob/master/UploadFiles/WebDemo/COM/DataToOut.aspx 效果: 然后勾选需要导出的数据,生成Excel 部分前台:…

spring 事务隔离级别和传播行为_Spring事务传播性与隔离性实战

一、事务传播性1.1 什么是事务的传播性事务的传播性一般在事务嵌套时候使用,比如在事务A里面调用了另外一个使用事务的方法,那么这俩个事务是各自作为独立的事务执行提交,还是内层的事务合并到外层的事务一块提交那,这就是事务传播…

前端为什么非要动静分离 说一下CDN托管的意义

大型Web应用对速度的追求并没有止步于仅仅利用浏览器缓存,因为浏览器缓存始终只是为了提升二次访问的速度,对于首次访问的加速,我们需要从网络层面进行优化,最常见的手段就是CDN(Content Delivery Network,…

CSS position(定位)属性

关于CSS position,来自MDN的描述: CSS position属性用于指定一个元素在文档中的定位方式。top、right、bottom、left 属性则决定了该元素的最终位置。 然后来看看什么是文档流(normal flow),下面是 www.w3.org 的描述: Normal flo…

Java ByteBuffer –速成课程

以我的经验,当开发人员第一次遇到java.nio.ByteBuffer时,会引起混乱和细微的错误,因为如何正确使用它尚不明显。 在我对API文档感到满意之前,需要反复阅读API文档和一些经验以实现一些微妙之处。 这篇文章是关于如何正确使用它们的…

实现编辑功能有哪几个action_Web 应用的撤销重做实现

背景前不久,我参与开发了团队中的一个 web 应用,其中的一个页面操作如下图所示:GIF这个制作间页面有着类似 PPT 的交互:从左侧的工具栏中选择元素放入中间的画布、在画布中可以删除、操作(拖动、缩放、旋转等&#xff…

windows下如何安装pip以及如何查看pip是否已经安装成功?

最近刚学习python,发现很多关于安装以及查看pip是否安装成的例子都比较老,不太适合于现在(python 3.6 )因此,下一个入门级别的教程。 0:首先如何安装python我就不做介绍了。 1:如果安装的是pyth…

检查用户显示器的分辨率

检查用户显示器的分辨率 转载于:https://www.cnblogs.com/Renyi-Fan/p/8088012.html

android 字体 dpi,详解Android开发中常用的 DPI / DP / SP

Android的碎片化已经被喷了好多年,随着国内手机厂商的崛起,碎片化也越来越严重,根据OpenSignal的最新调查,2014年市面上有18796种不同的Android设备,作为开发者,一个无法回避的难题就是需要适配各种各样奇奇…

android studio闪退代码不报错_代码不报错,不代表真的没错

今天是生信星球陪你的第695天大神一句话,菜鸟跑半年。我不是大神,但我可以缩短你走弯路的半年~就像歌儿唱的那样,如果你不知道该往哪儿走,就留在这学点生信好不好~这里有豆豆和花花的学习历程,从新手到进阶&#xff0c…

Centos7操作系统部署指南

一、硬件环境: Dell R620 二、软件环境: Centos6.4 X86_64 KVM Windows7vnc 三、安装说明 操作系统更新之迅速,让作为新手的系统运维人员有点措手不及,相对于老手就胸有成竹。怎么讲?由于老手对技术方向把握的非常好&…

Eclipse插件中的SLF4J登录

一直都在使用Maven和纯Java库进行开发,我从没想过在开发Eclipse插件时发出一些日志语句可能会成为问题。 但是,在Eclipse开发人员的想象中,一切似乎总是在Eclipse环境中,而Eclipse宇宙之外则什么都没有。 如果您使用Google搜索上…

Java EE 7社区调查结果!

在JSR 342下可以继续进行Java EE 7的工作。一切进展顺利,Java EE 7现在处于“初稿审查”阶段。 在11月初, Oracle发布了一个有关即将推出的Java EE 7功能的小型社区调查 。 昨天结果公布了。 超过1,100名开发人员参加了调查,并且几乎对每个问…

CSS(三)

CSS盒子模型 盒子模型解释 元素在页面中显示成一个方块,类似一个盒子,CSS盒子模型就是使用现实中盒子来做比喻,帮助我们设置元素对应的样式。盒子模型示意图如下: 把元素叫做盒子,设置对应的样式分别为:盒…

南昌互联网行业协会筹办者祝真和华罡团队-2014年12月江西IDC排行榜

他出自军营,拥有一身正气。 他在南昌创业,立意卓越。 从站点開始、到微营销、到线上教育,全面开花。 他在朋友圈看到不对的内容,就会即时批评。 他对朋友,又是很的和蔼可亲。 他就是南昌华罡网…

我应该使用32位还是64位JVM?

这是我在企业软件开发生涯中多次遇到的问题。 我不得不每隔一段时间就提供有关配置特定新环境的建议。 而且,很多时候,手头的问题与“我应该使用32位或64位JVM”有关。 老实说,一开始我只是掷硬币。 而不是给出合理的答案。 (对不…

android studio点击图片,如何在Android Studio中的模拟器图库中添加图像?

如何在Android Studio中的模拟器图库中添加图像?我正在开发图像过滤器应用程序。 但是,如果我没有任何图像,就无法真正尝试。我知道我可以在电话中对其进行测试,但这并不相同,因为我需要错误消息和其他内容。我只想从A…

android移动应用基础教程源代码,Android移动应用基础教程 【程序活动单元Activity】...

本章目录一、Activity的生命周期1、生命周期状态2 、生命周期方法3、横竖屏切换时的生命周期二、Activity的创建配置和关闭1、Activity的创建2、配置Activity3、开启和关闭Activity三、Intent与IntentFilter1、Intent介绍1.1 意图的概念1.2 显式意图1.3 隐式意图2、IntentFilte…