乱披风锤法锤炼ArrayList源码中的get、set、contains、isEmpty方法!!!肝起

点赞在看,养成习惯。

点赞收藏,人生辉煌。

点击关注【微信搜索公众号:编程背锅侠】,防止迷路。

转载请标注来源出处,谢谢合作。共同学习,共同进步。

前言

源码血泪史

乱披风锤法,这个自创魂技可是唐三非常强烈的一个技能,将昊天锤的九九八十一锤以和自己的鬼影迷踪步结合在了一起,缺陷弥补了,而且将优势发挥得更大,最后的一锤的吴天锤更是所向披靡,无敌的存在。看源码也一样要经历九九八十一难,才能够真正理解其中的奥妙。

看源码是一个比较耗费时间和精力的过程,可能会要看很多遍才能够真正的看懂。看源码也是一个很磨砺一个人的耐心的过程,没有耐心和静下心来看源码看了一遍也会感觉跟没看没啥区别。好的东西要多看,就像我们行走在大街上,对面来了一个美女,都会忍不住多看几眼。

下面有从构造方法开始到集合的删除、批量删除的源码解析以及案例的演示。也有集合的添加、批量添加的源码解析及演示。而且也可以从这几篇文章中看到每次添加集合的底层数组的数据变化。

如果在看这篇文章中发现有什么不对的地方,尽管留言,一起探讨解析,共同学习共同进步。

相比于 面试官让我讲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判断集合是否为空。

创作不易, 非常欢迎大家的点赞、评论和关注(^_−)☆

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

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

原文 

https://juejin.im/post/5f02947c5188252e644ce99d

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 乱披风锤法锤炼ArrayList源码中的get、set、contains、isEmpty方法!!!肝起

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址