【Java集合源码解析】ArrayList

通过阅读源码 熟悉API-ArrayList-基于jdk1.8
增加
//将指定的元素添加至队列末尾
public boolean add(E e)
//将指定的元素添加到指定的索引位置
public void add(int index, E element)
//添加指定的元素集到队列末尾
public boolean addAll(Collection<? extends E> c)
//将指定的元素集添加到指定的索引位置
public boolean addAll(int index, Collection<? extends E> c)
//添加到指定索引位置时首先校验索引是否合法
private void rangeCheckForAdd(int index){
    //大于0,小于当前容量size,否则抛出异常
    throw new IndexOutOfBoundsException
}
//检查列表list内部数组的容量大小
private void ensureCapacityInternal(int minCapacity){
    //如果数组为空,则取默认大小为10,否则使用当前容量+1
    //
}
//精确计算容量
private void ensureExplicitCapacity(int minCapacity){
    //修改数据 modCount+1
    //如果需要的容量大于当前容量,则进扩容
    grow(minCapacity){
        //新容量为原容量+原容量的一半
        **int newCapacity = oldCapacity + (oldCapacity >> 1);**
    };
}
删除
//移除列表中指定索引的元素
public E remove(int index){
    //判断索引是否合法
    //计算出需要移动的后续元素数量
    //将后续元素向左移动
    //将索引减一,并将最后一位至为null
}
//移除列表中值为o的元素
public boolean remove(Object o){
    //判断o是否为null
        //如果为null则循环判断移除列表中值为null的元素
    //否则循环判断移除值为o的元素
    //调用fastRemove删除相关元素
}
//删除包含在这个集合中的所有元素
public boolean removeAll(Collection<?> c)
public boolean removeIf(Predicate<? super E> filter){
    //TODO
    if (filter.test(element)) {
        removeSet.set(i);
        removeCount++;
    }
    //TODO
    for (int i=0, j=0; (i < size) && (j < newSize); i++, j++) {
        **i = removeSet.nextClearBit(i);**
        elementData[j] = elementData[i];
    } 
}
private void fastRemove(int index){
    //计算出需要移动的后续元素数量
    //将后续元素向左移动
    //将索引减一,并将最后一位至为null
}
private boolean batchRemove(Collection<?> c, boolean complement){
    //c中不包含的元素 为true,则保留
    if (c.contains(elementData[r]) == complement)
    //contains抛出异常,说是保持兼容性,不太懂,正常情况下r应该等于size
    if (r != size) {
        //需要将r后size前没有判断是否包含的元素全部追加至筛选后的元素后
        System.arraycopy(elementData, r,
                            elementData, w,
                            size - r);
        w += size - r;
    }
    //接下来将elementData后面不需要的元素至为null
    //修改size,modCount,modified
}
修改
//直接按照指定的索引修改数组中对应的元素值
public E set(int index, E element)
//把列表所有元素按照operator操作一遍
public void replaceAll(UnaryOperator<E> operator)
查找
//找到返回索引,没找到返回-1
public int indexOf(Object o)
//
public void forEach(Consumer<? super E> action){
    for (int i=0; modCount == expectedModCount && i < size; i++) {
        action.accept(elementData[i]);
    }
}
排序
public void sort(Comparator<? super E> c){
    //通过Arrays.sort()实现
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值