點贊在看,養成習慣。
點贊收藏,人生輝煌。
點擊關注【微信搜索公衆號:編程背鍋俠】,防止迷路。
轉載請標註來源出處,謝謝合作。共同學習,共同進步。
前言
看源碼血淚史
亂披風錘法,這個自創魂技可是唐三非常強烈的一個技能,將昊天錘的九九八十一錘以和自己的鬼影迷蹤步結合在了一起,缺陷彌補了,而且將優勢發揮得更大,最後的一錘的吳天錘更是所向披靡,無敵的存在。看源碼也一樣要經歷九九八十一難,才能夠真正理解其中的奧妙。
看源碼是一個比較耗費時間和精力的過程,可能會要看很多遍才能夠真正的看懂。看源碼也是一個很磨礪一個人的耐心的過程,沒有耐心和靜下心來看源碼看了一遍也會感覺跟沒看沒啥區別。好的東西要多看,就像我們行走在大街上,對面來了一個美女,都會忍不住多看幾眼。
下面有從構造方法開始到集合的刪除、批量刪除的源碼解析以及案例的演示。也有集合的添加、批量添加的源碼解析及演示。而且也可以從這幾篇文章中看到每次添加集合的底層數組的數據變化。
如果在看這篇文章中發現有什麼不對的地方,儘管留言,一起探討解析,共同學習共同進步。
相比於面試官讓我講ArrayList中add、addAll方法的源碼…我下次再來這一篇文章中的源碼,這一篇的源碼相當簡單。這一篇我主要看的是
根據索引獲取元素的get方法
、根據索引修改集合元素的set方法
、判斷集合是否包含指定元素的contains方法
和判斷集合是否爲空isEmpty方法
。接下來就進入ArrayList源碼的世界遨遊吧。
ArrayList系列文章
第一篇:ArrayList中的構造方法源碼在面試中被問到了…抱歉沒準備好!!!告辭
第二篇:面試官讓我講ArrayList中add、addAll方法的源碼…我下次再來
第三篇:工作兩年還沒看過ArrayList中remove、removeAll、clear方法源碼的都來報道吧
第四篇: 亂披風錘法錘鍊ArrayList源碼中的get、set、contains、isEmpty方法!!!肝起來
主要內容
方法名 | 描述 |
---|---|
public E get(int index) |
根據索引獲取元素 |
public E set(int index, E element) |
根據索引修改集合元素 |
public boolean contains(Object o) |
判斷集合是否包含指定元素 |
public boolean isEmpty() |
判斷集合是否爲空 |
public E get(int index)
根據索引獲取元素
案例演示
@Test
public void test_get_(){
ArrayList<String> list = new ArrayList<>();
list.add("洛洛01");
list.add("洛洛02");
// 根據索引獲取value
String str = list.get(0);
System.out.println(str);// 洛洛01
}
源碼分析
// 根據指定的索引獲取值
public E get(int index) {
// 檢查索引是否有效
rangeCheck(index);
// 返回該索引對應的value
return elementData(index);
}
// 校驗給定的索引,是否在0~size-1的範圍內
private void rangeCheck(int index) {
// 判斷這個index是否大於等於size
if (index >= size)
// 大於等於size拋出腳標越界異常
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
// 根據指定的索引獲取元素
E elementData(int index) {
// 返回獲取到的元素
return (E) elementData[index];
}
查看elementData數組中元素
總結
(E) elementData[index]
是真正的從集合的底層數組中取指定位置的元素的。我們也可以從上面的圖片中看的到。
- 1、先校驗給定的索引,是否在0~size-1的範圍內,大於等於size拋出腳標越界異常。
- 2、根據指定的索引獲取元素。
public E set(int index, E element)
根據索引修改集合元素
案例演示
@Test
public void test_set(){
ArrayList<String> list = new ArrayList<>();
list.add("洛洛01");
list.add("洛洛02");
list.set(1, "洛洛03");
list.forEach(System.out::println);
}
源碼分析
// 根據指定的索引和元素,修改指定索引上的元素,返回的是修改之前的元素
public E set(int index, E element) {
// 檢查索引是否有效,索引不在範圍內拋出空指針異常
rangeCheck(index);
// 獲取指定索引上的值,賦值給oldValue
E oldValue = elementData(index);
// 將制定索引上的值進行替換修改
elementData[index] = element;
// 返回該索引修改之前的值
return oldValue;
}
// 校驗給定的索引,是否在0~size-1的範圍內
private void rangeCheck(int index) {
// 判斷這個index是否大於等於size
if (index >= size)
// 大於等於size拋出腳標越界異常
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}
// 根據指定的索引獲取元素
E elementData(int index) {
// 返回獲取到的元素,根據指定的index
return (E) elementData[index];
}
elementData數組中元素的變化
- elementData源數組在修改之前
- elementData源數組在修改之後
總結
- 1、檢查索引是否有效,索引不在範圍內拋出空指針異常。
- 2、獲取指定索引上的值,賦值給oldValue。
- 3、將制定索引上的值進行替換修改。
- 4、返回該索引修改之前的值【舊值】。
public boolean contains(Object o)
判斷集合是否包含指定元素
案例演示
@Test
public void test_contains(){
ArrayList<String> list = new ArrayList<>();
list.add("洛洛01");
list.add("洛洛02");
// 判斷是否包含這個元素
boolean b = list.contains("洛洛01");
System.out.println(b);
}
源碼分析
// 根據指定的元素,判斷集合是否包含這個元素,包含返回true,否則返回false
public boolean contains(Object o) {
// 具體實現方法在下面
return indexOf(o) >= 0;
}
// 核心方法,根據指定的元素判斷集合是否包含
public int indexOf(Object o) {
// 判斷給定的元素是否爲空
if (o == null) {
// 循環遍歷集合
for (int i = 0; i < size; i++)
// 判斷集合中是否有null,如果有直接返回這個集合的索引
// 當集合中有多個null的時候,從左邊第一個null對應的索引開始返回
if (elementData[i]==null)
return i;
} else {
// 給定的元素不爲空,循環遍歷集合
for (int i = 0; i < size; i++)
// 判斷是否有相等的,並返回索引
if (o.equals(elementData[i]))
return i;
}
// 如果集合中沒有與給定元素相等的就返回-1
return -1;
}
總結
- 1、給定的元素爲null。
- 2、循環遍歷集合。
- 3、判斷集合中是否有null,如果有直接返回這個集合的索引,當集合中有多個null的時候,從左邊第一個null對應的索引開始返回,只返回一個。
- 4、給定的元素不爲空。
- 5、循環遍歷集合。
- 6、判斷集合中是否有與給定元素相等的,如果有直接返回這個集合的索引,當集合中有多相等的時候,從左邊第一個索引開始返回,但是隻返回一個。
- 7、如果包含fancied索引大於等於0,否則返回-1,左後根據是否大於等於0,校驗是否包含。
public boolean isEmpty()
判斷集合是否爲空
案例演示
@Test
public void test_isEmpty(){
ArrayList<String> list = new ArrayList<>();
list.add("洛洛01");
list.add("洛洛02");
// 這個方法的使用還是很方便的,直接調用就可以判斷集合是否爲空
System.out.println(list.isEmpty());
}
源碼分析
// 判斷集合是否爲空
public boolean isEmpty() {
// 根據集合的長度是否等於0判斷集合是否爲空
return size == 0;
}
總結
- 1、根據集合的長度是否等於0判斷集合是否爲空。
創作不易, 非常歡迎大家的點贊、評論和關注(^_−)☆
你的點贊、評論以及關注是對我最大的支持和鼓勵,而你的支持和鼓勵
我繼續創作高質量博客的動力 !!!