ArrayList、Vector、LinkedList类均在java.util包中,均为可伸缩数组,即可以动态改变长度的数组。
一、ArrayList、Vector
相同点:
①都是基于存储元素的Object[] array来实现的,他们会在内存中开辟一块连续的空间来存储
(因为连续,所以可以用下标来访问元素,同时索引数据的速度比较快)
②插入元素时需要移动容器中的元素,所以虽数据的插入操作执行得比较慢
③都有一个初始化的容量的大小,当里面存储的元素超过这个大小时,需要动态的扩充他们的存储空间。Vector默认扩充原来的2倍(每次扩充空间的大小是可以设置的),ArrayList默认扩充原来的1.5倍(没有提供方法)
import java.util.*;
public class HelloWorld {
public static void main(String []args) {
ArrayList<Integer> al=new ArrayList<Integer>();
al.add(0,100);
System.out.println(al.get(0));//根据索引,获得元素
System.out.println(al.indexOf(100));//根据元素,获得索引
al.add(1,200);
al.remove(0);
System.out.println(al.contains(100));
System.out.println(al.get(0));//200
Vector<String> v=new Vector<String>();
v.add(0,"100");
System.out.println(v.get(0));//根据索引,获得元素
System.out.println(v.indexOf("100"));//根据元素,获得索引
v.add(1,"200");
v.remove("100");
System.out.println(v.contains("100"));
System.out.println(v.get(0));//200
}
}
不同点:(线程安全与性能)
①ArrayList的方法都不是同步的,而Vector的绝大多数方法都是直接同步或者间接同步的,所以Vector是线程安全的,ArrayList不是线程安全的。正是因为Vector提供了线程安全的机制,其性能上也就略逊与ArrayList
二、LinkedList
方法:https://blog.csdn.net/jiangshangchunjiezi/article/details/75210587
LinkedList采用双向循环链表来实现的
除了实现list接口外,LinkedList类还为在列表的开头及结尾get、remove、inset元素提供了统一的命名方法。
此类实现Queue接口,为add、poll提供先进先出队列操作。
①随机访问效率低:对数据的索引需要从链表头开始遍历
②插入元素:无需对数据移动
③非线程安全的容器
三、容器如何选择
当对数据的操作是索引或只在集合的末端增加、删除元素,使用ArrayList、Vector效率比较高;
当对数据的操作只要为指定位置的插入、删除操作时,用LinkedList效率比较高
当多线程时,Vector安全