02、Java集合之ArrayList详解

1.Java集合

java三大集合类,list set map
![clollection简单继承结构](https://img-blog.csdn.net/20170315093642279?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYXNsZ21fMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

2.定义

ArrayList正如名字一样数组列表,或者数组队列 ,其是基于数组实现的扩充的,所以又叫做动态数组

3.特性

1)因为实现了List,所以arrayList是有序的。
2)因为是基于数组实现的,所以访问元素快。
3)因为插入元素时,涉及到数组元素要整体移动,所以插入慢。

4.源码分析

1.构造函数
//默认构造函数
public ArrayList() {
        this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;//这里是一个空数组
    }
//构造指定大小list
public ArrayList(int arg0) {...}
//创建一个包含collection的ArrayList
public ArrayList(Collection<? extends E> arg0) {...}

注意:默认构造函数创建的arrayList大小是空的。

2.重要方法
1)添加元素
//在列表尾部添加元素。
public boolean add(E arg0) {...}
//在指定位置添加元素
public void add(int arg0, E arg1){
    this.rangeCheckForAdd(arg0);//检查添加位置是否越界,故arg0可以等于size(list大小)
    this.ensureCapacityInternal(this.size + 1);//检查数组是否需要扩容
    System.arraycopy(this.elementData, arg0, this.elementData, arg0 + 1, this.size - arg0);
    //极其重要一个方法,目的是从原数组this.elementData指定位置arg0开始复制,长度为this.size - arg0到目标数组this.elementData从arg0 + 1开始覆盖。
    this.elementData[arg0] = arg1;
    ++this.size;
}

注意:添加元素的流程为检查数组大小,有位置直接添加,没位置需要扩容。
扩容

private void grow(int arg0) {
        int arg1 = this.elementData.length;
        int arg2 = arg1 + (arg1 >> 1);//原大小+原大小/2
        if (arg2 - arg0 < 0) {
            arg2 = arg0;
        }
        if (arg2 - 2147483639 > 0) {
            arg2 = hugeCapacity(arg0);
        }
this.elementData = Arrays.copyOf(this.elementData, arg2);
    }
2)删除元素
//删除指定位置元素
public E remove(int arg0) {
        this.rangeCheck(arg0);
        ++this.modCount;
        Object arg1 = this.elementData(arg0);
        int arg2 = this.size - arg0 - 1;
        if (arg2 > 0) {
            System.arraycopy(this.elementData, arg0 + 1, this.elementData, arg0, arg2);
        }//添加和删除一个原理
        this.elementData[--this.size] = null;
        return arg1;
    }
//删除指定元素
public boolean remove(Object arg0) {
        int arg1;
        if (arg0 == null) {
            for (arg1 = 0; arg1 < this.size; ++arg1) {
                if (this.elementData[arg1] == null) {
                    this.fastRemove(arg1);
                    return true;
                }
            }
        } else {
            for (arg1 = 0; arg1 < this.size; ++arg1) {
                if (arg0.equals(this.elementData[arg1])) {
                    this.fastRemove(arg1);//和上边删除指定位置元素方法一样,不过少了一个验证index越界检验。
                    return true;
                }
            }
        }
        return false;
    }
//这个方法,是删除列表中所有元素,注意传参哦
public boolean removeAll(Collection<?> arg0) {...}

总结:

还有很多方法没列出来,因为我觉得弄明白这两个方法实现原理,其他的如get方法,迭代器方法,subList截取子列表,trimToSize()等等,很简单了。。。
System. arraycopy(Object src, int srcPos,Object dest, int destPos,int length);
这个方法很重要,添加就是基于它实现的。
我建议大家可以自己实现下,这是我实现的,主要写了几个简单的接口
https://github.com/AminLiu/JavaCoding/tree/master/src/dataStructure

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值