Java ArrayList详解

ArrayList 介绍

ArrayList 是一个数组队列,相当于 动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List, RandomAccess, Cloneable, java.io.Serializable这些接口。和Vector不同,ArrayList中的操作不是线程安全的。所以,建议在单线程中才使用ArrayList,而在多线程中可以选择Vector

ArrayList 源代码分析

构造函数:

//无参构造函数,默认长度为10
public ArrayList(){
    this(10);
}

//带参数的构造函数,指定长度
public ArrayList(int i){
    if(i < 0){
        throw new IllegalArgumentException((new StringBuilder()).append("Illegal Capacity: ").append(i).toString());
    } else{
        //Arraylist的内部结构就是一个Object数组
        elementData = new Object[i];
        return;
    }
}

其他常用方法:

//是否为empty是看size是否为0
public boolean isEmpty(){
    return size == 0;
}

//判断是否包含某个元素
public boolean contains(Object obj){
    return indexOf(obj) >= 0;
}
public int indexOf(Object obj){
    if(obj == null){//判断元素为null时,包含的元素中如果有为null则为true
        for(int i = 0; i < size; i++)
            if(elementData[i] == null)
                return i;
    } else{//判断元素不为null时,用equals方法来判断
        for(int j = 0; j < size; j++)
            if(obj.equals(elementData[j]))
                return j;
    }
    return -1;
}

//获取元素最后位置,原理同contains
public int lastIndexOf(Object obj){
    if(obj == null){
        for(int i = size - 1; i >= 0; i--)
            if(elementData[i] == null)
               return i;
    } else{
        for(int j = size - 1; j >= 0; j--)
            if(obj.equals(elementData[j]))
                return j;
    }
    return -1;
}

//set和get都是简单的操作数组
public Object get(int i){
    //数组判断
    rangeCheck(i);
    return elementData(i);
}
private void rangeCheck(int i){
    if(i >= size)//数组越界移除抛出的情况
        throw new IndexOutOfBoundsException(outOfBoundsMsg(i));
    else
        return;
}
public Object set(int i, Object obj){
    rangeCheck(i);
    Object obj1 = elementData(i);
    elementData[i] = obj;
    return obj1;
}
......

其他add、set、remove等也都是对数组elementData进行操作,增加、替换、移动位置等。
看了上面的源码,我们就会发现其实Arraylist的实现比较简单,基本就是对一个Object数组的操作。

附:
遍历ArrayList时,使用随机访问(即,通过索引序号访问)效率最高,for循环次之,而使用迭代器的效率最低!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值