收藏表数据库_选择您的收藏库

收藏表数据库

这真的是您应该烦恼的吗? 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那样跟踪所有对象的创建和销毁,因此性能受到限制,并且可能会增加一些开销。 在这种情况下,您可以尝试现有的解决方案,而不是从头开始构建自己的解决方案,从而可能会更好。

参考:在Plumbr博客博客中,从我们的JCG合作伙伴 Vladimir Sor 选择您的收藏库 。

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

收藏表数据库

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

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

相关文章

matlab norm向量和矩阵的范数

一、向量的范数 首先定义一个向量为:a[-5,6,8, -10] 1.1 向量的1范数 向量的1范数即:向量的各个元素的绝对值之和,上述向量a的1范数结果就是:29,MATLAB代码实现为:norm(…

不能启动的问题 社区版安装后_CentOS7下安装docker(亲测+完整)

说明:1、docker要求Centos系统内核高于3.10,安装前先验证你的Centos版本是否支持docker;2、docker有两个分支版本:docker CE和docker EE,即社区版和企业版,自学研究建议使用社区版本;本文章介绍…

关于数据可视化页面制作

先出思路 数据可视化,目的是为了让纷繁的数据变得直观,更易领会数据代表的趋势、模型等。既然是带着目的的,应先把目标明确下来。目标写下来,思想上算落地了,那么就能给大脑腾出继续深入或扩展的空间。所以&#xff0c…

GitHub Research:超过50%的Java记录语句写错了

为什么生产日志无法帮助您找到错误的真正根本原因? 询问您是否使用日志文件监视您的应用程序几乎就像询问…您是否喝水。 我们都使用日志,但是我们如何使用它们则是一个完全不同的问题。 在下面的文章中,我们将对日志进行更深入的研究&…

matlab rgb2gray的实现

rgb2gray是matlab内部一种处理图像的函数,通过消除图像色调和饱和度信息同时保留亮度实现将将RGB图像或彩色图转换为灰度图像,即灰度化处理的功能,调用这个功能的格式是I rgb2gray(RGB),意思是将真彩色图像RGB转换为灰度强度图像…

8k分辨率需要多大带宽_又一支持8K分辨率的接口标准发布

随着8K显示热潮的兴起,支持8K视频传输和显示的硬件产品越来越多。继之前发布的HDMI2.1标准之后,又一支持8K分辨率视频传输的接口标准DisplayPort 2.0正式发布。视频电子标准协会(VESA)自推出DisplayPort标准之后,历经了多次的修订&#xff0c…

白话解说TCP/IP协议三次握手和四次挥手

白话解说TCP/IP协议三次握手和四次挥手 1、背景 和女朋友异地恋一年多,为了保持感情我提议每天晚上视频聊天一次。 从好上开始,到现在,一年多也算坚持下来了。 1.1、问题 有时候聊天的过程中,我的网络或者她的网络可能会不好&…

matlab 去除pdf文档水印

1用pdf shaper将pdf转为图片; 2用matlab程序去水印代码如下; 3将去除水印的图片通过pdf shaper转为pdf. 1_1.jpg为要去除水印pdf文档 2_1.jpg为空的pdf文档 test_1.jpg为去除水印的图片 img_1 imread(1_1.jpg); img_2 imread(2_1.jpg);img_3 img_2-img_1; img_4 255-i…

音频信号发生器_1957年,DIY的Hi-Fi 电唱机单电子管音频发生器的音质保真度高...

1957年Hi-Fi 电唱机单电子管音频发生器也许你的MP3播放器听起来比62年前这位绅士的高保真转盘听起来要好一些,但我打赌不太可能自己动手DIY一台MP3播放器,就像下面这个家伙那样。在1957年版的《Radio-TV Experimenter》的封面上显示的这个产品是个DIY产品…

tensorflow 启动Session(tf.Session(),tf.InteractivesSession(),tf.train.Supervisor().managed_session() )

(1)tf.Session() 计算图构造完成后, 才能启动图. 启动图的第一步是创建一个 Session 对象。 示例程序: #coding:utf-8 import tensorflow as tf #构造图 a tf.constant(4) b tf.constant(5) c ab#启动图 with tf.Session() as s…

终极Java日志字典:开发人员最常记录的单词是什么?

最终的记录字典,或者:我们记录的最常用单词是什么? 日志文件是调试应用程序的最常用方法,在解决错误时,它们一定可以引导我们朝着正确的方向发展。 但是,大多数日志文件每天都会增加一百万条消息&#xff…

iwrite提交不了作业_iWrite英语写作教学与评阅系统移动端——学生使用手册

通过微信搜索公众号:iWrite爱写作,点击“关注”。一、注册iWrite英语写作教学与评阅系统移动端首页底端显示“登录”按钮。首次关注,点击“登录”按钮,页面跳转至登录/注册界面。点击“注册账号”按钮,即可跳转至注册界…

阻塞IO与非阻塞IO

阻塞IO:操作系统等数据,只发生了一次调用,最大问题:cpu被耽搁了 非阻塞IO:问题:1、发生多次系统调用 2、数据不及时 IO multiplexing model io多路复用,多一个系统调用,但可以建…

matlab的输出(命令窗口、fprint函数、disp函数)

命令窗口直接输出,MATLAB的默认格式是精确到小数点后4位。如果一个数太大或太小,那么将会以科学记数法的形式显示。比如: format stytle 改变默认输出格式要用到format命令,可根据下表改变数据的输出格式 显示数值格式 Stytle …

g2 折线图点与点之间直线_科学网—ggplot2实现散点折线图 - 肖斌的博文

准备的数据:第一列是时间,第二列是样本,第三列是具体数值。横轴标为时间,纵坐标为具体数值,图中不同颜色展示不同样本。具体的代码:library(ggplot2)png("./xyz.png")(保存成png)upsups$date pde…

matlab 字符串处理

% 字符串处理 a a;bb b;ccccc;m % 获取字符串长度length(a) % 连接两个字符串,每个字符串最右边的空格被裁切 dstrcat(a,c) length(d) % 连接多行字符串,每行长度可不等,自动把非最长字符串最右边补空格 % 使与最长字符串相等,会忽略空字符串 est…

【c#基础】泛型

1:减少代码的选项可以是用Object类,也可以使用泛型 但是Object类进行类型传递不是类型安全的。泛型类使用泛型类型保证了类型安全。 泛型类 泛型方法 泛型接口、结构、委托 泛型优点: 1:性能 装箱和拆箱很容易使用,但性能损失比较…

nacos怎么修改服务分组_nacos服务注册如何配置分组?

同问,度娘一番,没找到答案,最终看的代码,大概知道怎么回事了。这个是下面引用源码的版本org.springframework.cloudspring-cloud-starter-alibaba-nacos-discoverycom.alibaba.nacosnacos-client0.2.2.RELEASEcom.alibaba.nacosna…

使用brew,cask和jenv在MacOSX上设置多个Java JRE / JDK

昨天在Java9的Jigsaw HackTheTower事件中,我意识到我需要加强我的游戏并改善我现有的机制,以在我的机器上维护几个不同的JDK。 我曾经手动下载jdk,或使用brew cask安装它们,我会在〜/ bash_profile上设置bash alias来在不同的 JA…

Codeforces - 102222C - Caesar Cipher

https://codeforc.es/gym/102222/my 好像在哪里见过这个东西&#xff1f;字符的左右移还是小心&#xff0c;注意在mod26范围内。 #include<bits/stdc.h> using namespace std; typedef long long ll;inline int read() {int x0;int f0;char c;do {cgetchar();if(c-)f1;} …