Java陣列 集合效能優化

2021-07-08 12:19:48 字數 1971 閱讀 8899

1、 複製陣列元素,使用system類arraycopy()方法替代迴圈賦值在陣列之間複製元素

建議:system類arraycopy()方法複製陣列元素

杜絕:迴圈賦值複製陣列元素

原因: system類arraycopy()方法呼叫作業系統更底層函式,效率更高。

注:通過實測,在元素數量達到億級別,兩者都在幾百毫秒,都很快,system類arraycopy()比迴圈賦值效能僅快1倍,但仍推薦使用system類arraycopy()。

2、避免建立集合不設定初始容量

使用集合(list、set、map)儲存大量的物件

建議:先估計儲存的元素個數,然後在建立集合時設定集合的容量值要大於估計的元素個數。

杜絕:未設定集合容量值

原因:建立集合物件,如果未設定集合初始容量值,則使用預設值,而預設值都很小(如,arraylist的初始容量為10),一旦儲存的元素個數超過閾值,會造成集合擴容。擴容方式是根據擴容因子建立乙個新的集合物件(初始容量=原有集合容量*擴容因子),再將原有集合中的元素拷貝到新的集合中。如果產生多次擴容,則會產生很多無用的中間集合物件,以及多次無意義的元素拷貝,效能低下。

正確示例: 估計儲存的元素個數最大為10000,使用arraylist集合

list

list = new arraylist(10000);

3、遍歷集合,使用迭代器替代迴圈呼叫帶索引的get方法

遍歷集合

建議:使用迭代器遍歷集合

杜絕:迴圈呼叫帶索引的get方法

原因:迭代器維護了遍歷集合的「指標」及內部狀態,它知道如何高效的遍歷集合。而集合提供的帶索引的get方法,對某些集合而言查詢索引需要從第乙個元素開始遍歷(如linkedlist),效率非常低下。

注:雖然迭代器遍歷某些特定集合效能並非最優,例如,遍歷arraylist,使用迴圈呼叫帶索引的get方法就比迭代器效能略高一些,但是絕大多數情況下迭代器遍歷集合都是最優的。對linkedlist,帶索引的get方法要從第乙個元素開始查詢,使用迴圈呼叫帶索引的get方法遍歷效率非常低。

正確示例:

iterator it = list.iterator();

while(it.hasnext())

錯誤示例:

list list =…

for(int i=0; i

< list.

size(); i++)

4、單執行緒使用hashmap/arraylist集合,避免使用hashtable/vector

單執行緒使用集合

建議:hashmap/arraylist

杜絕:hashtable/vector

原因:hashmap/arraylist是執行緒非安全的,元素的增加、刪除、查詢未實現同步,沒有鎖的申請和釋放開銷。而hashtable/vector是執行緒安全的,元素的增加、刪除、查詢實現同步,存在鎖的申請和釋放開銷。

5、判斷元素是否在集合中存在,使用hashset/hashmap替代list

判斷元素是否在集合中存在

建議:hashset/hashmap

杜絕:list

原因:使用list集合儲存元素,則需要比較list集合中的所有元素,才能判斷查詢的元素是否在集合中存在。

使用hashset/hashmap儲存元素,hashset/hashmap會將所有元素或key按hash值分桶儲存。通過查詢的元素或key的hash值可快速找到其所在的桶,此步效率非常高(接近於陣列的下標查詢元素),然後只需比較桶上的元素即可判斷元素是否在集合存在,比較次數大大降低。

Java陣列 集合效能優化

1 複製陣列元素,使用system類arraycopy 方法替代迴圈賦值在陣列之間複製元素 建議 system類arraycopy 方法複製陣列元素 杜絕 迴圈賦值複製陣列元素 原因 system類arraycopy 方法呼叫作業系統更底層函式,效率更高。注 通過實測,在元素數量達到億級別,兩者都在...

JAVA效能優化

1.string 比stringbuffer 更佔記憶體空間,拼接字串時 原因 string 這個物件的實際占用記憶體數量與其自身的位元組數不相符。結論 應該少用string 這東西,特別是string 的 操作,不僅原來的string 物件 不能繼續使用,而且又要產生多個新物件,因此會較高的占用記...

java效能優化

1.減少gc的壓力,gc 執行緒是乙個優先順序比較低的執行緒,他是乙個守護執行緒 服務於主線程 我們的堆記憶體 2.盡量避免我們的new操作 總結 避免物件建立和gc 物件使用完成後進行置空 string string a new string a string a1 a string a2 a b...