乱披风锤法锤炼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判断集合是否为空。

创做不易, 很是欢迎你们的点赞、评论和关注(^_−)☆

你的点赞、评论以及关注是对我最大的支持和鼓励,而你的支持和鼓励

我继续创做高质量博客的动力 !!!

相关文章
相关标签/搜索