集合框架

66 阅读2分钟

集合框架

ArrayList

1.构造方法

JDK7:直接创建一个容量为10的空数据组
JDK8:默认设置了一个空数据组,第一次add时创建容量为10的数组

image.png

image.png

2.add(E)

在add的时候判断,如果为空的话,就设置初始化大小为10

modCount++ (fast-fail快速失败 在遍历时修改会报CurrencyModifyException 并发修改异常)

扩容

  • 添加之前判断size+1是否大于ElementData(数组长度)
  • 如果大于就newCapacity = oldCapacity + (oldCapacity >> 1) 扩容1.5倍
  • Arrays.copyof(elementDatam, newCapacity) 拷贝数组到新数组

elementData[size++] = e

image.png

3.remove(E)

其实就是判断两个元素是否相等,然后调用fastRemove(index)方法

image.png

modCount++ (同上)

计算要被移动的数组的长度 numMoved = size - index - 1

调用 System,arraycopy(elementDate, index+1, elementDate, index, numMoved) 意思就是将源数组从 index+1位置开始 往后后数numMoved个,然后将这些数组拷贝到数组 从index开始,往后数numMoved个

将size--位置的置为空

image.png

LinkedList

1.add(E)

LinkedList add方法调用了带参数的构造方法

image.png

先保存尾节点
利用node的构造方法,设置当前节点的pre节点为原链表的尾节点
将尾节点设置为新加入节点
如果链表为空,设置新节点为头节点
如果链表不为空,设置原链表尾节点的next节点为新节点

说人话就是将新节点添加到链表尾部,然后并让last变成新节点

image.png

2.add(int,E)

要添加的位置是链表末尾,直接调用方法1
添加位置在链表中间,调用linkBefore,并传入添加的元素和index对应的节点

image.png

index所对应节点(succ)
succ前继节点(pred)
构造传入元素的节点,前继节点为pred,后继节点为succ
如果链表为空,设置新节点为头节点
pred节点的后记节点设置为新节点newNode,就是将newNode串到原链表index位置上
newNode的后记节点也设置为succ了,就串起来了

image.png

3.set(int,E)
检查index是否超过链表长度
创建node节点,node中利用二分法,从first或者从last找到index位置节点
保存新值,返回旧值

image.png