ArrayList
这个应该是我们最经常碰到的一个类型了,通常我都是这样List<String> list = new ArrayList<>(); list.add("小菜鸡")
那么里面一般都有什么方法呢?
其实他内部的实现就是一个数组,不过这个数组是可以拓展的数组(这只是一个概念,实际上数组在定义的时候,就已经确定了长度大小了,但是他会有一种扩容机制,来创建一个新的数组,然后把旧的数组的内容复制到新的数组,然后返回新的数组)
那么我们现在来了解一下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的时候,会进行扩容变成原来容量的两倍