1. 程式人生 > >ArrayList的contains()方法的效能問題及優化方法

ArrayList的contains()方法的效能問題及優化方法

  今天在專案效能測試過程中發現,某處程式碼通過ArrayList的contains()方法來檢查某個給定值是否存在於該ArrayList中的效能非常低(該ArrayList中有10萬個元素)。然後開始著手對其進行優化,下面主要介紹ArrayList的contains()方法的實現原理,以及優化後用來代替ArrayList的HashSet的contains()方法的實現原理,最後通過例項進行驗證優化效果。

1. 原理說明

1.1 ArrayList

  ArrayList中contains()方法的實現過程:
這裡寫圖片描述
  contains()方法呼叫了indexOf()方法,indexOf()具體實現如下。從原始碼可以看出,該方法通過遍歷資料和比較元素的方式來判斷是否存在給定元素。當ArrayList中存放的元素非常多時,這種實現方式來判斷效率將非常低,後面通過例項來驗證。
這裡寫圖片描述

1.2 HashSet

  既然ArrayList的contains()方法存在效能問題,那麼就應該尋找改進的辦法。這裡推薦使用HashSet來代替ArrayList。
  下面介紹HashSet的contains()方法的實現過程:

注:HashSet將元素存放在HashMap中(HashMap的key)

這裡寫圖片描述
  contains()方法呼叫HashMap的containsKey()方法
這裡寫圖片描述

  containsKey()方法呼叫getEntry()方法。在該方法中,首先根據key計算hash值,然後從HashMap中取出該hash值對應的連結串列(連結串列的元素個數將很少),再通過變數該連結串列判斷是否存在給定值。這種實現方式效率將比ArrayList的實現方法效率高非常多。
這裡寫圖片描述

2. 例項驗證

2.1 測試ArrayList

程式碼:

public static void main(String[] args) {
    ArrayList<String> arrayList = new ArrayList<>();
    // 存入100000個數據
    for (int i = 0; i < 100000; i++) {
        arrayList.add("test" + i);
    }

    // 驗證300000個數據(其中20000不存在)      
    long beginTime = System.currentTimeMillis();        for
(int i = 0; i < 300000; i++) { arrayList.contains("test" + i); } long endTime = System.currentTimeMillis(); System.out.println("cost time: " + (endTime - beginTime) + "ms"); }

列印結果:
cost time: 182210ms

2.2 測試HashSet

程式碼:

public static void main(String[] args) {

    Set<String> hashSet = new HashSet<>();
    // 存入100000個數據
    for (int i = 0; i < 100000; i++) {
        hashSet.add("test" + i);
    }

    // 驗證300000個數據(其中20000不存在)
    long beginTime = System.currentTimeMillis();
    for (int i = 0; i < 300000; i++) {
        hashSet.contains("test" + i);
    }
    long endTime = System.currentTimeMillis();

    System.out.println("cost time: " + (endTime - beginTime) + "ms");
}

列印結果:
cost time: 49ms

3. 總結

  通過第二節的例項可以看出,使用ArrayList的contains()耗時是使用HashSet的contains()方法的30多倍。具體原因可以參考第一節中的原理分析。

相關推薦

ArrayList的contains()方法效能問題優化方法

  今天在專案效能測試過程中發現,某處程式碼通過ArrayList的contains()方法來檢查某個給定值是否存在於該ArrayList中的效能非常低(該ArrayList中有10萬個元素)。然後開始著手對其進行優化,下面主要介紹ArrayList的conta

【Spark 深入學習-08】說說Spark分區原理優化方法

學習 格式 讀取文件 tmc 資料 數值計算 詳解 shc 存儲介質 本節內容 ------------------ · Spark為什麽要分區 · Spark分區原則及方法 · Spark分區案例 · 參考

MyISAM 存儲引擎的特點優化方法

同一文件 表格 批量插入 圖片 寫入 部分 全文檢索 讀取 相互 MyISAM: MyISAM 管理非事務表、是ISAM 的擴展格式。除了提供ISAM裏所沒有的索引的字段管理等的大量功能、MyISAM 還使用一種表格鎖定的機制、來優化多個並發的讀寫操作。MyISAM

jvm 記憶體溢位的多種原因優化方法

讓我們看一下我們日常在開發過程中接觸記憶體溢位的異常:   Exception in thread "main" [Full GCjava.lang.OutOfMemoryError: Java heap space at java.util.Ar

記憶體溢位的多種原因優化方法

對於JVM的記憶體寫過的文章已經有點多了,而且有點爛了,不過說那麼多大多數在解決OOM的情況,於此,本文就只闡述這個內容,攜帶一些分析和理解和部分擴充套件內容,也就是JVM宕機中的一些問題,OK,下面說下OOM的常見情況: 第一類記憶體溢位,也是大家認為最多

mysql索引的使用優化方法

資料庫高階管理及優化 MySQL效能優化 優化MySQL資料庫是資料庫管理員和資料庫開發人員的必備技能。優化MySQL,一方面是找出系統的瓶頸,提高MySQL資料庫整體的效能;另一方面是合理設計結構和調整引數,以提高使用者操作響應的速度。同時還要儘可能節省系統資源

網站開啟速度慢的原因,排查方法優化方法(大全)

如果你的網站開啟速度過慢,而你又不知道該如何解決,那麼這篇文章是非看不可了。手把手的教你如何排查網站開啟慢的原因,以及優化方法。 排查網站開啟速度慢的原因: 1網站伺服器速度或租用空間所在伺服器速度伺服器空間速度是網站開啟速度快的硬體基礎,也是先決條件。否則即使你網站頁面設

Failed: ambari-server方法彙總解決方法

假期第二天,適逢北京雨天。原本準備“臥床聽雨眠“,睡衣惺忪之際,突然感覺有什麼事情忘了。屈指一算,發現還欠著部落格的後續文章了。爬起來來辦公室加班整理ing........ 再次補充一點關於物理伺服器搭建準備: 補充1路由篇.在搭建服務時候很多時候能聯網會方便很多。所

sqlserver2008 死鎖解決方法效能優化方法

關於死鎖: sp_who active --看看哪個引起的死鎖, blk裡面即阻塞的spid; dbcc inputbuffer(@blk) -- 可以檢視是那個sql語句造成的死鎖; sp_lock --看看鎖住了那個資源,objid即被鎖住的資源id; select

Loadrunner 呼叫 Webservice 介面 進行 效能測試 時的方法優化總結

1.Webservice                       協議指令碼編寫流程 下面介紹使用 Loadrunner 呼叫 Webservice 介面 通用的流程與方法。 1.1 新建指令碼,選擇 "Webservice" 協議 1.2 選擇 Manag

HTTP2.0,HTTP1.1,HTTP1.0三者在通性效能上的優化方法

本文從從通訊效能角度,來分析對比HTTP1.0和HTTP1.1之間的區別。以及HTTP1.1與HTTP2.0之間的區別。本文詳細內容組織如下 目錄 一丶HTTP1.0與HTTP1.1通訊效能上的區別 持久化連線 管線化技術 二丶HTTP2.0與HTTP1.1通訊效能上的區別 多路

PHP的效能優化方法總結

什麼情況之下,會遇到PHP效能問題? 1:PHP語法使用不恰當。 2:使用PHP語言做了它不擅長的事情。 3:使用PHP語言連線的服務不給力。 4:PHP自身的短板(PHP自身做不了的事情)。 5:我們也不知道的問題?(去探索、分析找到解決辦法,提升開發境界)。 對線上站點做壓力測試的時候

不修改程式碼就能優化ASP.NET網站效能的一些方法

目錄 配置OutputCache 啟用內容過期 解決資原始檔升級問題 啟用壓縮 刪除無用的HttpModule 其它優化選項 本文將介紹一些方法用於優化ASP.NET網站效能,這些方法都是不需要修改程式程式碼的。 它們主要分為二個方面: 1. 利用ASP.NET自身的

網站排名下降的原因解決方法 網站排名優化下降

對於中小站長而言,大部分還是依靠搜尋引擎帶來的流量,可網站的關鍵詞排名又直接的決定了能從搜尋引擎帶來多少的流量,因此,我們誰都不希望自己辛辛苦苦做上去的關鍵詞排名下降,都希望自己網站的關鍵詞排名能不斷的上升,但實際情況又令站長們大失所望,那麼,究竟是那些原因導致

mysql 效能優化方法彙總

0、加索引 索引建立規則: 1.索引的欄位必須是經常作為查詢條件的欄位; 2.如果索引多個欄位,第一個欄位要是經常作為查詢條件的。如果只有第二個欄位作為查詢條件,這個索引不會起到作用; 3.索引的欄位必須有足夠的區分度; 4.Mysql 對於長欄位支援字首索引; 1、當只要

UE4 效能優化方法(工具篇)

2016-05-11 14:27 by 風戀殘雪, 22148 閱讀, 5 評論, 收藏, 編輯 本文依據UE4官方文件以及官方部落格等總結而來,可能不全面,後面會陸續新增。內建工具的詳細說明請參考官方文件。 遊戲幀率很低,或者有卡頓的現象,可能會有很多原因,這時

Android的效能優化方法

佈局優化 佈局優化的思想:儘量減少佈局檔案的層級。佈局的層級少了,這就意味著Android的繪製工作量少了,那麼程式的效能自然提高了。 如何進行佈局優化呢? 刪除佈局中無用的控制元件和層級 有選擇地使用效能較低的ViewGroup,比如RelativeL

Android 效能優化方法

Android 效能優化方法 開發中常會做一些效能優化,主要優化內容包括佈局層級優化,繪製優化,記憶體洩露優化(音訊,視訊,io等回收),響應速度優化,ListView優化,Bitmap優化,執行緒優化以及一些效能優化,在面試中面試官也會經常問到該點 . 前面博文我收集的各大

前端效能優化方法總結

    1、基礎:     高層協議有:檔案傳輸協議FTP、電子郵件傳輸協議SMTP、域名系統服務DNS、網路新聞傳輸協議NNTP和HTTP協議等 中介由三種:代理(Proxy)、閘道器(Gateway)和通道(Tunnel),一個代理根據URI的絕對格式來接受請求,重寫全部或部分訊息,通過 URI的標識

常見的web效能優化方法

前言:關於優化問題,隨著專案經驗不斷累積,多方查詢資料進行拼接合並,形成如下文章,之後遇到類似好的方法,會不斷補充完善。 前端是龐大的,包括 HTML、 CSS、 Javascript、Image 、Flash等等各種各樣的資源。前端優化是複雜的,針對方方面面的資源都有不