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类的方法大都是同步的。