亂披風錘法錘鍊ArrayList源碼中的get、set、contains、isEmpty方法!!!肝起

點贊在看,養成習慣。web

點贊收藏,人生輝煌。面試

點擊關注【微信搜索公衆號:編程背鍋俠】,防止迷路。編程

轉載請標註來源出處,謝謝合做。共同窗習,共同進步。數組

前言

看源碼血淚史

亂披風錘法,這個自創魂技但是唐三很是強烈的一個技能,將昊天錘的九九八十一錘以和本身的鬼影迷蹤步結合在了一塊兒,缺陷彌補了,並且將優點發揮得更大,最後的一錘的吳天錘更是所向披靡,無敵的存在。看源碼也同樣要經歷九九八十一難,纔可以真正理解其中的奧妙。微信

看源碼是一個比較耗費時間和精力的過程,可能會要看不少遍纔可以真正的看懂。看源碼也是一個很磨礪一我的的耐心的過程,沒有耐心和靜下心來看源碼看了一遍也會感受跟沒看沒啥區別。好的東西要多看,就像咱們行走在大街上,對面來了一個美女,都會忍不住多看幾眼。編輯器

下面有從構造方法開始到集合的刪除、批量刪除的源碼解析以及案例的演示。也有集合的添加、批量添加的源碼解析及演示。並且也能夠從這幾篇文章中看到每次添加集合的底層數組的數據變化。源碼分析

若是在看這篇文章中發現有什麼不對的地方,儘管留言,一塊兒探討解析,共同窗習共同進步。post

相比於面試官讓我講ArrayList中add、addAll方法的源碼...我下次再來這一篇文章中的源碼,這一篇的源碼至關簡單。這一篇我主要看的是根據索引獲取元素的get方法根據索引修改集合元素的set方法判斷集合是否包含指定元素的contains方法判斷集合是否爲空isEmpty方法。接下來就進入ArrayList源碼的世界遨遊吧。學習

ArrayList系列文章

第一篇:ArrayList中的構造方法源碼在面試中被問到了...抱歉沒準備好!!!告辭
第二篇:面試官讓我講ArrayList中add、addAll方法的源碼...我下次再來
第三篇:工做兩年還沒看過ArrayList中remove、removeAll、clear方法源碼的都來報道吧
第四篇:亂披風錘法錘鍊ArrayList源碼中的get、set、contains、isEmpty方法!!!肝起
url

主要內容

方法名 描述
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]是真正的從集合的底層數組中取指定位置的元素的。咱們也能夠從上面的圖片中看的到。

  • 一、先校驗給定的索引,是否在0~size-1的範圍內,大於等於size拋出腳標越界異常。
  • 二、根據指定的索引獲取元素。

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源數組在修改以後

總結

  • 一、檢查索引是否有效,索引不在範圍內拋出空指針異常。
  • 二、獲取指定索引上的值,賦值給oldValue。
  • 三、將制定索引上的值進行替換修改。
  • 四、返回該索引修改以前的值【舊值】。

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; } 複製代碼

總結

  • 一、給定的元素爲null。
  • 二、循環遍歷集合。
  • 三、判斷集合中是否有null,若是有直接返回這個集合的索引,當集合中有多個null的時候,從左邊第一個null對應的索引開始返回,只返回一個。
  • 四、給定的元素不爲空。
  • 五、循環遍歷集合。
  • 六、判斷集合中是否有與給定元素相等的,若是有直接返回這個集合的索引,當集合中有多相等的時候,從左邊第一個索引開始返回,可是隻返回一個。
  • 七、若是包含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; } 複製代碼

總結

  • 一、根據集合的長度是否等於0判斷集合是否爲空。

創做不易, 很是歡迎你們的點贊、評論和關注(^_−)☆

你的點贊、評論以及關注是對我最大的支持和鼓勵,而你的支持和鼓勵

我繼續創做高質量博客的動力 !!!