//儲存arraylist中的內容
transient object elementdata; // non-private to simplify nested class access
//表示元素的數量
private
int size;
transient 關鍵字,就是這部分不參與序列化
建構函式有三個
//沒有引數時,構建乙個空的
private
static
final object defaultcapacity_empty_elementdata = {};
public
arraylist()
//當有乙個引數時,就是代表開多大的空間,注意,這裡並沒有設size的值哦
private
static
final object empty_elementdata = {};
public
arraylist(int initialcapacity) else
if (initialcapacity == 0) else
}
//用集合構造,轉成陣列後,返回給elementdata,返回若不是object將呼叫arrays.copyof方法將其轉為object
public arraylist(collection<? extends e> c) else
}
get方法//正常的get方法
public e get(int
index)
//對index的檢測
private
void rangecheck(int
index)
//注意這個是沒有邊界檢測的
@suppresswarnings("unchecked")
e elementdata(int
index)
set方法//有index的檢測,返回的是舊的值
public e set(int
index, e element)
add方法//ensurecapacityinternal稍後講,除了為了有足夠大的空間,還有其他的作用
public
boolean
add(e e)
//在index位置處插入element
public
void add(int
index, e element)
//這裡檢測是否在那個區間內,個人感覺有點兒問題,比如,初始構造給了引數,接下來在某個位置add乙個數,換句話說,有了空間,但該位置沒數,此時該不該丟擲越界異常
private
void rangecheckforadd(int
index)
addall//加入集合中的全部,多開空間
public
boolean
addall(collection<? extends e> c)
//在index位置上加入集合中的全部
public
boolean addall(int
index, collection<? extends e> c)
remove方法//先看下是否越界,再移除,返回的是舊的值
public e remove(int
index)
//移除第乙個與o相等的物件,注意remove(int index)是移除index位置的,如果想要移除的object本身就是int該怎麼辦,hiahia
public
boolean remove(object o)
} else
}return
false;
}//和remove(int index)一樣,為什麼不直接呼叫呢?
private
void fastremove(int
index)
//移除fromindex,toindex中的元素(這個沒有判斷越界?
protected
void
removerange(int fromindex, int toindex)
size = newsize;
}
size方法public
intsize()
isempty()方法public
boolean
isempty()
indexof方法(o(n))//返回o的第一次出現的下標,注意是從前往後依次遍歷的
public
intindexof(object o) else
return -1;
}
//返回o最後一次出現的位置,是從後往前依次遍歷的
public
intlastindexof(object o) else
return -1;
}
contains方法//就是判斷第一次出現的位置,也是o(n),(我還以為會用hashset之類的呢
public
boolean
contains(object o)
toarray方法public object toarray()
@suppresswarnings("unchecked")
public t toarray(t a)
clearpublic
void
clear()
sublistpublic listsublist(int fromindex, int toindex)
//這裡fromindex > toindex並不會交換
static
void sublistrangecheck(int fromindex, int toindex, int size)
add時候的空間檢測private
static
final
int default_capacity = 10;
//取當前需要的空間和10的最大值
private
void
ensurecapacityinternal(int mincapacity)
ensureexplicitcapacity(mincapacity);
}//看element的已有空間,是否能滿足
private
void
ensureexplicitcapacity(int mincapacity)
//取需要的空間與原來空間1.5倍中最大值
private
void
grow(int mincapacity)
//所需空間非常大時候的判斷,如果是integer.max_value,需要84m,注意爆棧
private
static
inthugecapacity(int mincapacity)
求elementdata與乙個集合的交集和差集//差集
public
boolean
removeall(collection<?> c)
//交集
public
boolean
retainall(collection<?> c)
//設乙個complement變數來判斷是留或者去掉,感覺好機智啊
private
boolean
batchremove(collection<?> c, boolean complement) finally
if (w != size)
}return modified;
}
對於這個變數,大家可能會好奇是什麼用,是為了多執行緒中判斷是否被修改時使用,舉個例子
public
void
sort(comparator<? super e> c)
modcount++;}
至此,對arraylist有了基本的了解,其中很重要的itr沒有說明,打算專門開乙個說。
vue原始碼之Array
目錄 響應式具體實現 陣列子集和新增元素的追蹤 array中的問題 object通過setter改變屬性的值,所以我們利用getter時傳送依賴收集,在setter時觸發依賴更新,而且vue將資料轉換成響應式資料是在資料初始化時,對object中之後的屬性新增和刪除操作,無法做到自動更新,而是通過v...
Java原始碼分析之ArrayList
自我學習原始碼,也借鑑了網上其他的資料,有寫的不準確的地方,請輕噴,謝謝 1 繼承自abstractlist類 2 實現了randomaccess介面,randomaccess介面是list 實現所使用的標記介面,用來表明其支援快速 通常是固 定時間 隨機訪問。此介面的主要目的是允許一般的演算法更改...
JAVA原始碼分析Collection之Map
map的底層實現 linkedlist陣列,乙個非常大的陣列,linkedlist中儲存的是myentry物件 包括key和value屬性的物件 因為要保證map中的查詢速度比較快,是基於雜湊演算法來實現的,雜湊的主要實現是依靠hashcode方法。hashcode的產生是基於,記憶體位址產生的,保...