当前位置 : 主页 > 编程语言 > c语言 >

关于Java面试中的ArrayList底层结构、底层源码的高频热点面试题解析

来源:互联网 收集:自由互联 发布时间:2023-08-28
(目录) 一、ArrayList的底层结构 ArrayList实现了 List 接口 ArrayList:底层数据结构是数组,特点是查询快,增删慢 二、ArrayList的底层源码分析 面试热点问题 (1)ArrayList底层是什么数据结构?

(目录)


一、ArrayList的底层结构

             ArrayList实现了 "List" 接口
             ArrayList:底层数据结构是"数组",特点是"查询快,增删慢"

二、ArrayList的底层源码分析

面试热点问题
(1)ArrayList底层是什么数据结构?
     ArrayList底层是一个Object数组: "transient Object[] elementData;"

(2)底层的数组的初始化长度是多少?
           使用"无参构造方法创建集合"时,数组的初始长度为 0

           使用"带参构造方法创建集合"时,数组长度由参数值指定
           
           
          public ArrayList() {
              this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;    //this.elementData={};
             }

         private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};

(3)首次调用add方法添加元素的时候,数组的长度变为多少?
              如果"初始化的数组长度为0","首次添加元素"时,长度会扩容为"10"
               
              elementData=grow();   //grow();长度不够时会自动增长

(4)如果添加的元素超过数组长度,怎么办?
             数组会"自动扩容",长度在"原来的基础上增加一半"
                 
      int oldCapacity= elementData.length;
      int newCapacity= oldCapacity+(oldCapacity>>1)  >>1相当于除以2 (右移1位)
 
          
          
          
//注意:每一次发现现有的数组装不下,都会再次扩容一个1.5倍大小的新数组   (原来的基础上增加一半)
    
    新数组的长度 = 旧数组的长度+ 旧数组长度/2(直接舍弃小数部分)
    
        22     =   15      +       7
                             (15/2=7.5)  
    
//可以这样子记,新数组长度 = 旧数组长度*1.5 ,然后不要小数部分

作者:KJ.JK

网友评论