面试官Q1:可以手写一个ArrayList的简单实现吗?

我们都知道ArrayList是基于数组实现,如果让你实现JDK源码ArrayList中add()、remove()、get()方法,你知道如何实现吗?这一节,我们不看源码,我们想想如何简单的实现ArrayList几个基本方法?

确定数据结构

我们知道,ArrayList中无论什么数据都能放,是不是意味着它是一个Object类型,既然是数组,那么是不是Object[]数组类型的?所以我们定义的数据结构如下:

private Object[] elementData; private int size;

设置自定义的MyArrayList的长度为10

public MyArrayList(){ this(10); } public MyArrayList(int initialCapacity){ if(initialCapacity<0){ try { throw new Exception(); } catch (Exception e) { e.printStackTrace(); } } elementData = new Object[initialCapacity];}

有了存放数据的位置,接下来,我们想想如何将数据放入数组?

添加数据

public void add(Object obj){ elementData[size++]=obj;}

每添加一个元素,size就会自增1,我们定义的数组长度为10,当我们添加到11个元素的时候,显然没有地方存放新添加的数据,这个时候我们需要对数组进行扩容处理对上面代码做如下修改:

public void add(Object obj){ if(size==elementData.length){ //创建一个新的数组,并且这个数组的长度是原数组长度的2倍 Object[] newArray = new Object[size*2]; //使用底层拷贝,将原数组的内容拷贝到新数组 System.arraycopy(elementData, 0, newArray, 0, elementData.length); //并将新数组赋值给原数组的引用 elementData = newArray; } //新来的元素,直接赋值 elementData[size++]=obj;}

用一张图来表示就是这样的:

查询数据

public Object get(int index){ return elementData[index];}

删除数据

接着我们看一下删除的操作。ArrayList支持两种删除方式:

  • 按照下标删除
  • 按照元素删除,这会删除ArrayList中与指定要删除的元素匹配的第一个元素

对于ArrayList来说,这两种删除的方法差不多,都是调用的下面一段代码:

public void remove(int index){ //删除指定位置的对象 //a b d e int numMoved = size - index - 1; if (numMoved > 0){ System.arraycopy(elementData, index+1, elementData, index, numMoved); } elementData[--size] = null; // Let gc do its work}

其实做的事情就是两件:

  • 把指定元素后面位置的所有元素,利用System.arraycopy方法整体向前移动一个位置
  • 最后一个位置的元素指定为null,这样让gc可以去回收它

用图表示是这样的:

指定位置添加数据

把从指定位置开始的所有元素利用System,arraycopy方法做一个整体的复制,向后移动一个位置(当然先要用ensureCapacity方法进行判断,加了一个元素之后数组会不会不够大),然后指定位置的元素设置为需要插入的元素,完成了一次插入的操作。

public void add(int index,Object obj){ ensureCapacity(); //数组扩容 System.arraycopy(elementData, index, elementData, index + 1, size - index); elementData[index] = obj; size++;}

用图表示这个过程是这样的:

总结一下

从上面的几个过程总结一下ArrayList的特点:

  • ArrayList底层以数组实现,是一种随机访问模式,通过下标索引定位数据,所以查找非常快
  • ArrayList在顺序添加一个元素的时候非常方便,只是往数组里面添加了一个元素而已(这里指的末尾添加数据)
  • 当删除元素的时候,涉及到一次元素复制移位,如果要复制的元素很多,那么就会比较耗费性能
  • 当插入元素的时候,涉及到一次元素复制移位,如果要复制的元素很多,那么就会比较耗费性能

因此,ArrayList比较适合顺序添加、随机访问的场景。

arraylist下标从几开始_剖析JAVA面试题 手写ArrayList的实现,在笔试中过关斩将?...相关推荐

  1. 银行java面试题手写代码_面试系列——手写代码实现(一)

    前言 本文是面试系列篇的实现篇.笔者整理了面试过程中可能会遇到的手写实现,以及它的原理.这可以帮助面试者在笔试环节获得良好的加分. 其他文章系列,欢迎关注我文末的公众号 正文 apply和call a ...

  2. python手写代码面试_常见Python面试题—手写代码系列

    原标题:常见Python面试题-手写代码系列 1.如何反向迭代一个序列 #如果是一个list,最快的方法使用reverse tempList = [1,2,3,4] tempList.reverse( ...

  3. python面试代码题_常见python面试题-手写代码系列

    原博文 2019-08-13 13:50 − 1.如何反向迭代一个序列 #如果是一个list,最快的方法使用reversetempList = [1,2,3,4]tempList.reverse()f ...

  4. python手写代码面试_常见Python面试题 — 手写代码系列

    原标题:常见Python面试题 - 手写代码系列 作者: Peace & Love 来自:https://blog.csdn.net/u013205877/article/details/77 ...

  5. 面试必会之ArrayList源码分析手写ArrayList

    作者:Java知音-微笑面对生活 简介 ArrayList是我们开发中非常常用的数据存储容器之一,其底层是数组实现的,我们可以在集合中存储任意类型的数据,ArrayList是线程不安全的,非常适合用于 ...

  6. java arraylist 当参数_关于java:为什么修改了ArrayList参数,但没有修改String参数?...

    本问题已经有最佳答案,请猛点这里访问. public class StackOverFlow { public static void main(String[] args) { ArrayList ...

  7. java基础知识点_「Java面试题/知识点精华集」20000+字的Java基础知识篇(2020最新版) !

    " 本文已经收录进我的 79K Star 的 Java 开源项目 JavaGuide:https://github.com/Snailclimb/JavaGuide (「Java学习+面试指 ...

  8. java 多态判断非空_收藏Java 面试题全梳理

    脚本之家 你与百万开发者在一起 来源 | Java建设者(ID:javajianshe) 作者 |cxuan 如若转载请联系原公众号 Java 基础篇 Java 有哪些特点 并发性的:你可以在其中执行 ...

  9. JAVA手写ArrayList以及LinkedList

    手写记录一下~ 顶级接口List public interface List<E> {//返回线性表的大小public int getSize();//判断线性表中是否为空public b ...

最新文章

  1. 软件测试培训分享:性能测试的目的是什么
  2. 基于cookie的SSO单点登录系统
  3. SpringBoot 2.0静态资源映射
  4. leetcode 164. Maximum Gap | 164. 最大间距(桶排序)
  5. 梯度下降法_梯度下降
  6. 2022年中国在线视频行业研究报告
  7. tablespace innodb_index_stats is missing
  8. 《设计模式详解》结构型模式 - 代理模式
  9. 第七章节 类的抽象(抽象类和接口的区别)
  10. js系列教程4-函数、函数参数全解
  11. 同样是创业,同样是两年,有的已经做了几千万,这边已经内斗死了
  12. STM32驱动LCD1602,哪位同学需要的,来了
  13. Golang + HTML5 实现多文件上传
  14. ip关联是什么意思,亚马逊如何防止ip关联(ip关联过多是什么意思)
  15. 搭建安卓打包环境,用官方示例anysdk生成apk运行
  16. python gpl_详细介绍 GPL 协议
  17. SQLserver提权
  18. 什么是网站站群?网站站群有哪些类型?
  19. 数据结构与算法 第八天常见排序+冒泡排序+快速排序+文件IO+大数据排序+文件合并
  20. (经典)瑾此献给1975-1989年出生的人(看后请顶)

热门文章

  1. java加互斥锁关键字_Java中用于给对象加“互斥锁”标记的关键字是。( )
  2. 英特尔自动驾驶部门秘密申请IPO 有望成今年美股规模最大IPO
  3. iPhone 14系列将采用打孔屏:Face ID等元件或置屏幕下
  4. 泰森中国宣布与阿里云达成战略合作
  5. 飞书正式发布5.0版 推出飞书人事、合同、审批等多款新产品
  6. 遭做空后又被律所调查 贾跃亭的FF上市不到3个月股价已近腰斩
  7. 小米平板5系列获EEC认证:骁龙870加持 预装深度定制MIUI系统
  8. 微信回应朋友圈广告无法一键关闭:将持续优化产品体验
  9. 小霸王消失,好记星落灰,谁能“取悦”10后?
  10. 摩托罗拉Edge真机谍照曝光:挖孔瀑布屏+骁龙765