與linkedlist原始碼理解放在一起查閱,效果更好
對隊成員變數的分析,可以知道arraylist的資料結構
對add()方法的分析,可以得知arraylist新增資料的效率不高
對get()方法的分析,可以看出arraylist查詢的效率非常高
對remove()方法的分析,可以了解到arraylist刪除資料的效率不高
與linkedlist比較,arraylist有以下特點:
查詢效率高新增和刪除的效率不高
資料結構是陣列
從成員變數中可以看出,arraylist是用陣列object來儲存資料的
//容器預設大小
private
static
final
int default_capacity = 10;
//空的容器
private
static
final object empty_elementdata = {};
//容器,用來儲存資料
private
transient object elementdata;
//標記容器的大小
private
int size;
三個重寫的構造方法都是用來初始化容器
//構造方法
public
arraylist(int initialcapacity)
//構造方法
public
arraylist()
//構造方法
public
arraylist(collection<? extends e> c)
從下面的**中可以看出,arraylist是通過陣列賦值的方式來新增資料
//新增資料
public
boolean add(e e)
//向指定的位置新增資料
public
void add(int
index, e element)
從下面的**中可以看出陣列的大小是動態變化的,一般擴充倍數為1.5倍
//根據mincapacity來確定容器的大小
private
void
ensurecapacityinternal(int mincapacity)
ensureexplicitcapacity(mincapacity);
}private
void
ensureexplicitcapacity(int mincapacity)
//array的最大值
private
static
final
int max_array_size = integer.max_value - 8;
//擴中容器
private
void
grow(int mincapacity)
//處理容量巨大時的情況
private
static
inthugecapacity(int mincapacity)
說明:arraylist在新增資料的時,有時候會移動大量的資料,導致新增資料效率不高。
從下面的**中可以看出,arraylist在查詢資料時,通過index直接鎖定記憶體,可以迅速地找到相應的資料
//獲取指定位置上的資料
public e get(int
index)
移除指定位置上的資料:remove(int index)
//移除指定位置上的資料
public e remove(int
index)
說明:移除特定的資料:remove(object o)1. 移除操作實際上是乙個覆蓋資料的操作,是將後面乙個資料覆蓋到前乙個位置,如果是末尾的資料,則直接置空。
2. 與add()中的耗時操作類似:可能移動大量的資料導致低效率
//移除容器中第乙個相應的資料
public
boolean remove(object o)
} else
}//容器中沒有相應的資料
return
false;
}//移除指定位置上的資料
private
void fastremove(int
index)
說明:與remove(int index)相比,多了一步遍歷查詢的操作
//根據object找到第乙個出現的位置
public
intindexof(object o) else
//沒有找,返回-1
return -1;
}
這裡**與linkedlist中的類似,都是遍歷對比。效率高也僅僅是這裡鎖定了記憶體。
了解了arraylist的原理,對我們優化**,提公升效率會有很大的幫助,這裡也給出使用建議:如果查詢操作較多,使用arraylist的效果更好.
ArrayList 原始碼理解
擴容機制 原始碼如下 mincapacity 最小需要的容量,也就是說儲存資料的陣列最小需要mincapacity所指定小長度。private void ensureexplicitcapacity int mincapacity private void grow int mincapacity ...
簡單理解ArrayList原始碼
1.arraylist是動態擴容的,每次擴容為原來長度的1.5倍,並且採用的是懶載入策略,當第一次呼叫add方法時,陣列才會擴容為10 預設值 2.模擬實現list介面 public inte ce list 自己實現的myarraylist在構造方法中陣列就初始化大小為10,原始碼中在第一次呼叫a...
ArrayList原始碼分析
arraylist是平時使用很多的乙個類,趁有時間,我也閱讀以下原始碼,以幫助自己加深理解。類的層次結構這裡就不列出了,主要分析一下原始碼部分,屬性部分 protected transient int modcount 0 這個屬性是從abstractlist繼承過來的,每次arraylist進行結...