選擇您的收藏庫

這真的是您應該煩惱的嗎? 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.pswp.cn/news/370150.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/370150.shtml
英文地址,請注明出處:http://en.pswp.cn/news/370150.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

里公式后面標號怎么對齊_你若會用Word里F4鍵,又何須加班到半夜?

F4鍵在Word里面表示重復上一個操作,但對于這個快捷鍵,你真的會操作嗎?本期與大家分享這個神奇的F4鍵,助你高效工作。1、批量復制文本在一般情況下,我們是用CtrlC復制內容,CtrlV粘貼內容,但遇到特…

全方位分析web前端如何進行性能優化

前言: 最近剛剛完成項目,空閑一段時間,想起之前有被問起怎么對前端進行性能優化,自己也是腦中零零散散的總不成體系,現特來總結,歡迎補充指教。 1、整體資源 (1)js、css源碼壓縮 &a…

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 部分前臺:…

c語言清空輸入緩沖區函數,c語言:C語言清空輸入緩沖區在標準輸入(stdin)情況 -電腦資料...

C語言清空輸入緩沖區在標準輸入(stdin)情況下的使用程序1://功能:先輸入一個數字,再輸入一個字符,輸出hello bit#include int main(){int num 0;char ch ;scanf("%d", &num);scanf("%c", &ch);pri…

Spring MVC 3:上傳多個文件

只是在辦公室又漫長的一天,數據庫不可用,一個團隊成員現在滯后一周。 因此,我們必須作為一個團隊來交付它。 在Spring3,它看起來很直接上傳文件。 但是,從jsp文件上載多個文件幾乎沒有幫助。 上載多個文件需要完成三件…

spring 事務隔離級別和傳播行為_Spring事務傳播性與隔離性實戰

一、事務傳播性1.1 什么是事務的傳播性事務的傳播性一般在事務嵌套時候使用,比如在事務A里面調用了另外一個使用事務的方法,那么這倆個事務是各自作為獨立的事務執行提交,還是內層的事務合并到外層的事務一塊提交那,這就是事務傳播…

前端為什么非要動靜分離 說一下CDN托管的意義

大型Web應用對速度的追求并沒有止步于僅僅利用瀏覽器緩存,因為瀏覽器緩存始終只是為了提升二次訪問的速度,對于首次訪問的加速,我們需要從網絡層面進行優化,最常見的手段就是CDN(Content Delivery Network,…

unity語音聊天之 www.GetAudioClip

最近在開發語音聊天功能,游戲需要跨平臺安卓與ios,上傳本地錄制的wav文件至服務器后,需要根據服務器返回的地址進行語音文件的下載并進行播放。 這里通過使用www進行下載并播放 其中在ios播放時卻不行了,查詢官方文檔后發現,ios必…

輕談BFC

BFC 定義 CSS2.1的定義 Block formatting contexts 9.4.1 Block formatting contexts Floats, absolutely positioned elements, block containers (such as inline-blocks, table-cells, and table-captions) that are not block boxes, and block boxes with overflow other …

Java中的Selenium / WebDriver示例

幾年前,我正在忙于一些工作,客戶希望了解如何解決現實世界中的問題。 他們要求我自動化woot.com網站上的某些任務。 他們的任務是訪問各個網站,并閱讀當天商品的名稱和價格。 我寫了一些Selenium代碼,以為可以將其張貼在這里&am…

c語言中怎樣實現空格的替換,C語言實現去除字符串中空格的簡單實例

在網上看了些去除空格的代碼,覺得都不是很簡潔,就自己寫代碼實現它本著高效率,不使用額外存儲空間的想法實現該功能去除空格一共有三種:1、去除全部空格;2、一種是去除左邊空格;3、去除右邊空格想去除左右兩邊空格,只要先去除左邊…

python消息隊列中間件_python-RabbtiMQ消息隊列

1.RabbitMQ簡介AMQP,即Advanced Message Queuing Protocol,高級消息隊列協議,是應用層協議的一個開放標準,為面向消息的中間件設計。消息中間件主要用于組件之間的解耦,消息的發送者無需知道消息使用者的存在&#xff…

CSS position(定位)屬性

關于CSS position,來自MDN的描述: CSS position屬性用于指定一個元素在文檔中的定位方式。top、right、bottom、left 屬性則決定了該元素的最終位置。 然后來看看什么是文檔流(normal flow),下面是 www.w3.org 的描述: Normal flo…

tomcat配置文件server.xml詳解

版權聲明:本文為博主原創文章,未經博主允許不得轉載。 目錄(?)[] 元素名 屬性 解釋 server port 指定一個端口,這個端口負責監聽關閉tomcat 的請求 shutdown 指定向端口發送的命令字符串 service name 指定service 的名字 Con…

均值,方差,協方差,協方差矩陣,特征值,特征向量

大牛博客,收藏一下 http://blog.csdn.net/yangleo1987/article/details/52845912轉載于:https://www.cnblogs.com/gaohai/p/8086626.html

Java ByteBuffer –速成課程

以我的經驗,當開發人員第一次遇到java.nio.ByteBuffer時,會引起混亂和細微的錯誤,因為如何正確使用它尚不明顯。 在我對API文檔感到滿意之前,需要反復閱讀API文檔和一些經驗以實現一些微妙之處。 這篇文章是關于如何正確使用它們的…

c語言cth三角函數表示,三角函數與雙曲函數基本公式對照表

圓函數(三角函數)1.基本性質:sin tan cos x x x ,cos cot sin xx x 1sec cos x x ,1csc sin x x tan cot 1x x sin csc 1x x sec cos 1x x 22sin cos 1x x 221tan sec x x ,221cot csc x x 2.奇偶性:sin()sin x x -- cos()cos x x - tan()tan x x --3.…

實現編輯功能有哪幾個action_Web 應用的撤銷重做實現

背景前不久,我參與開發了團隊中的一個 web 應用,其中的一個頁面操作如下圖所示:GIF這個制作間頁面有著類似 PPT 的交互:從左側的工具欄中選擇元素放入中間的畫布、在畫布中可以刪除、操作(拖動、縮放、旋轉等&#xff…

為什么我們要做三份 Webpack 配置文件

時至今日,Webpack 已經成為前端工程必備的基礎工具之一,不僅被廣泛用于前端工程發布前的打包,還在開發中擔當本地前端資源服務器(assets server)、模塊熱更新(hot module replacement)、API Pro…