首页 > 代码库 > ArrayList数组列表

ArrayList数组列表

ArrayList数组列表

Collection接口和List接口的区别

  • List接口扩充了Collection接口,添加了索引相关的方法。
  • code example

     

    Object get(int index)
    Object set(int index,Object element)
    int indexOf(Object elem)
    void add(int index,Object element)
    Object remove(int index)

     

  • List接口中的大多数方法是基于索引的。

ArrayList类

1、可以看成一维数组的改良版,支持随机访问,ArrayList对象的大小自动调整。 2、ArrayList对象中每个元素的相对位置都是利用索引表示,索引范围0~n-1 3、给定一个索引,访问这个索引位置上的元素时间是常数级别。 4、删除元素,最坏情况是O(n-index),所以删除靠后面的元素花费的时间越少。 5、插入元素,最坏情况是O(n-index),所以插入末尾操作花费时间越少。

源码方法分析(具体可以看java documnet)

 

public ArrayList Object(int initialCapacity);
指定初始化容量的大小

 

 

public boolean add(Object o);
在末尾插入元素

 

 

public int size();
返回容器的有效元素个数

 

......

ArrayList对象的可串行化

ObjectOutputStream

ArrayList对象的可克隆性

实现了Clonable接口 方法:

 

public Object clone();

 

复制的是ArrayList对象中元素的引用,并不是对象,所以称为“浅复制”。

 

public class ArrayListDemo {
    
    public static void main(String[] args) {
        ArrayList<Integer> list=new ArrayList<Integer>(3);
        list.add(1);
        list.add(2);
        System.out.println("list size="+list.size());
        ArrayList<Integer> temp=(ArrayList<Integer>) list.clone();
        System.out.println("temp size="+temp.size());
        //www.90168.org不改变克隆对象
        list.add(3);
        System.out.println("list result size="+list.size());
        System.out.println("temp result size="+temp.size());
    }

}

/*
*list size=2
*temp size=2
*list result size=3
*temp result size=2
*/

 

ArrayList的扩充,分摊时间

1、数组一般扩充50% 2、add()方法将newCapacity设置成(oldCapacity*3)/2+1并没有实际的意义,只是为了时间和空间的平衡。

Fail-First迭代器

1、继承了AbstractList的modCount字段 add()、remove()modCount加1 一旦next()方法激活,就不能修改ArrayList。

 

public class ArrayListDemo2 {
    
    public static void main(String[] args) {
        ArrayList<Integer> list=new ArrayList<Integer>();
        list.add(2);
        list.add(3);
        
        Iterator it=list.iterator();
        while(it.hasNext()){
            int ele=(int) it.next();
            //进行修改,会抛异常
            list.add(1, 4);
            System.out.println(ele);
        }
    }

}

 

与Vector类的区别

1、Vector类也是基于数组实现 2、Vector类的方法大都是同步的。

ArrayList数组列表