首先,它们是list的实现类,大致说一下vector arraylist linkedlist的区别。
1、线程安全来讲,
vector是线程安全,arraylist linkedlist线程不安全。
2、底层实现来讲,
vector arraylist是数组,linkedlist是双向链表。
3、效率上讲,
vector比arraylist慢。
由于vector和arraylist底层是数组,所以查找起来很快,
而linkedlist是通过指针查找,所以查找起来相对较慢。
而数组的增、删元素,会引起移动数据,而链表则不会。
例如linkedlist删除某一元素,是将这个元素前后两个元素连接在一起,然后将移出的元素置空,
而如果是往arraylist中增加一个元素,比如add(3,"aaa")是把原来第3这个元素移到第4位,第4位移到第5位,依此类推,空出一个位置用来放加进去的元素。
由此可见,arraylist在增删元素时效率会比linkedlist要慢。
linkedlist有头尾指针,于是它可以addFirst("第一个")和addLast("最后一个"),以及getFirst()和getLast()。
是不是arraylist一定就比linkedlist在增删数据慢呢?
未必!
如果已经找到位置的情况下,确实linkedlist要快一点。但实际上,很多时候都需要先找位置,然后插入。
如果找得太久,arraylist就占优势了。
例如,我们往90000这个位置插入一个元素,arraylist很快就能找到这个位置,然后插入,
而linkedlist需要将指针一个个移到这个位置,再插入。
同样是完成往90000这个位置插入一个元素的任务,谁更快,可想而知。
当然,如果linkedlist一直addFirst或addLast,这样也可以省去查找的时间。
另外,假如有100000个元素,如果是arraylist,往第一个位置增加一个元素,和住第50000个增加元素,和往第100000个增加元素,效果是有很大区别的。
主要是区别在于,移动数据的多少。
4、vector和arraylist的扩容问题,
由于底层是数组,它们在初始化时,都是有长度的。
arraylist初始化的三种方式:
1)不初始化起容量 ArrayList al = new ArrayList();//默认容量为10
2)初始化容量ArrayList al = new ArrayList(3);//初始容量为3
3)以一个集合或数组初始化ArrayList al = new ArrayList(a);//a为集合或数组
当一个长度为10的arraylist在添加第11个元素时,它会以当前长度的1.5倍在堆内存中重新创建一个数组对象,然后把原数组内的数据复制过来,放弃原数组,指向新数组。
vector是同样的道理,只不过,它是以2倍的速度扩容,也就是如果原数组长度是10,那么新数组的长度就是20。
下面是用法例子:
package wzq.j2se.obj;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Vector;
public class ListDemo {
public static void main(String[] args) {
System.out.println("-------vector--------");
Vector v = new Vector(4);
v.add("Test0");
v.add("Test1");
v.add("Test0");
v.add("Test2");
v.add("Test2");
v.remove("Test0"); //删除指定内容的元素
v.remove(0); //按照索引号删除元素
int size = v.size();
System.out.println("size:" + size);
for(int i = 0;i < v.size();i++){
System.out.println(v.get(i));
}
System.out.println("-------arraylist--------");
List list = new ArrayList();
list.add("test0");
list.add("test1");
list.add("test2");
//list.addAll(v);
list.add("test3");
list.remove("test1");
list.remove(2);//注意这儿,是指重新排序后的元素,也就是test3成了第二个元素:test0,test2,test3
for(int i=0;i<list.size();i++){
System.out.println(list.get(i));
}
System.out.println("---------------");
/*ArrayList与数组之间的转换:
*/
List list1 = new ArrayList();
list1.add("1");
list1.add("2");
final int size1 = list1.size();
String[] arr = (String[])list1.toArray(new String[size1]);
System.out.println("arr=="+arr[0]);
System.out.println("arr=="+arr[1]);
String[] arr2 = new String[] {"4", "5"};
List list2 = Arrays.asList(arr2);
for(int i=0;i<list2.size();i++){
System.out.println(list2.get(i));
}
System.out.println("-------linkedlist--------");
//初使化一个链表
LinkedList head = new LinkedList();
head.add(new String("小狗"));
head.add(new String("美国"));
head.add(new String("Japanese!"));
head.add(2, "小猪");
//链表会自动用遍历的方式打印所有內容
System.out.println(head);
//利用Vector或者是ArrayList等Collection往链表中加数据
Vector v1 = new Vector();
//向Vector中加入东西
v1.add("大狗");
v1.add("老美");
v1.add("JAPAN");
v1.add("老猪");
//将当前Vector加在当前链表的最后
head.addAll(v1);
System.out.println(head);
//将当前Vector加在当前链表的指定位置
head.addAll(2, v1);
System.out.println(head);
//打印指定位置的內容
System.out.println(head.get(2));
head.addFirst("第一个");
System.out.println(head);
head.addLast("最后一个");
System.out.println(head);
//刪除第一个
head.remove(head.getFirst());
System.out.println(head);
//再刪除第一个,采用下标的方式,下标是从0开始的
head.remove(0);
System.out.println(head);
head.remove(head.getLast());
System.out.println(head);
}