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());
//不改变克隆对象
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类的方法大都是同步的。