ArrayList、StringBuffer(StringBulider)、HashMap的初始化长度以及扩容规则

文章目录

    • ArrayList
      • 初始化默认长度
      • 扩容规则
    • StringBuffer StringBuilder
      • 初始化默认长度
      • 扩容规则
    • HashMap
      • 初始化默认长度
      • 扩容规则

ArrayList

这个应该是我们最经常碰到的一个类型了,通常我都是这样List list = new ArrayList<>(); list.add("小菜鸡")
那么里面一般都有什么方法呢?
ArrayList、StringBuffer(StringBulider)、HashMap的初始化长度以及扩容规则_第1张图片
其实他内部的实现就是一个数组,不过这个数组是可以拓展的数组(这只是一个概念,实际上数组在定义的时候,就已经确定了长度大小了,但是他会有一种扩容机制,来创建一个新的数组,然后把旧的数组的内容复制到新的数组,然后返回新的数组)

那么我们现在来了解一下add和remove的方法实现:

add方法的实现:
我们在add元素之前,我们要做的就是确保容量是充足的,这里涉及到了一个ensureCapacityInternal的方法,这个方法会先去判断当前的数组是不是空的,如果是空的,说明我们还没有放置元素进去,初始话默认的长度DEFAULT_CAPACITY的值为10。如果需要的长度大于当前数组的长度的话,我们就会进行扩容,扩充容量到原来容量的1.5倍,再进行判断,如果容量还是不够的话,我们就会将容量设置为我们需要的最小容量,也就是当前的容量

remove方法的实现:
remove(index),首先会计算要移动的元素的个数,从index往后的元素全部都往前移动一位,实际上调用了System.arraycopy的方法移动对象,然后elementData[–size]=null,将size减一,并将最后一位置为null
(这里和StringBuilder有点不一样,StringBuilder是有一个count来记录已经使用的长度,然后在删除元素的时候,全部往上移位,修改count即可)(在一次debug的时候发现的,也不知道对不对)

值得注意的是每次对ArrayList进行操作之后,会有一个字段(modCount)来记录当前操作了多少次,以便于检查当前ArrayList的结构有没有发生改变

初始化默认长度

  • DEFAULT_CAPACITY = 10

扩容规则

  • 如果需要的长度大于当前数组的长度的话,我们就会进行扩容,扩充容量到原来容量的1.5倍,再进行判断,如果容量还是不够的话,我们就会将容量设置为我们需要的最小容量,也就是当前的容量

————————————————————————————————————————

StringBuffer StringBuilder

初始化默认长度

  • DEFAULT_CAPACITY = 16

扩容规则

(原始容量*2+2)和(数组实际字符个数+新增的字符长度)

——————————————————————————————————————————

HashMap

初始化默认长度

  • DEFAULT_CAPACITY = 16

扩容规则

加载因子默认为0.75(可以修改),当使用容量到达0.75的时候,会进行扩容变成原来容量的两倍

你可能感兴趣的:(面试)