List里ArrayList与LinkedList以及Vector之间的区别
ArrayList
基底是一个可改变大小的数组.当更多的元素加入到ArrayList中时,其大小将会动态地增长.初始容量是十;内部的元素可以直接通过get与set方法进行访问,因为ArrayList本质上就是一个数组.不同步,因此线程不安全 ;ArrayList是一个动态数组,也是我们最常用的集合。它允许任何符合规则的元素插入甚至包括null。每一个ArrayList都有一个初始容量(10),该容量代表了数组的大小。随着容器中的元素不断增加,容器的大小也会随着增加。在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作。所以如果我们明确所插入元素的多少,最好指定一个初始容量值,避免过多的进行扩容操作而浪费时间、效率。具体参照手动实现ArrayList; ArrayList擅长于随机访问。同时ArrayList是非同步的。
package List;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Test1 {
public static void main(String[] args) {
List list=new ArrayList();
Person a=new Person(“ww”,22);
list.add(new Person(“张三”,21));
list.add(new Person(“李四”,23));
list.add(new Person(“王五”,24));
list.add(a);
//遍历
Iterator it=list.iterator();
// list.add(new Person(“赵六”,24));ArrayList使用迭代器后将不能操控集合中的yuansu
while(it.hasNext()) {
Person p=it.next();
System.out.println(p.toString());
}
//删除
list.remove(a);
System.out.println("---------------------");
//get()方法 返回此列表中指定位置上的元素。
for(int i=0;i<list.size();i++) {
System.out.println(list.get(i));
}
// set(int index, E element)
// 用指定的元素替代此列表中指定位置上的元素。
for(int i=0;i<list.size();i++) {
if(i==2) {
list.set(i,new Person(“赵六”,23));
}
}
System.out.println("---------------------");
for(int i=0;i<list.size();i++) {
System.out.println(list.get(i));
}
}
}
LinkedList
是一个双链表,在添加和删除元素时具有比ArrayList更好的性能.但在get与set方面弱于ArrayList.不同步(就是线程不安全) 同样实现List接口的LinkedList与ArrayList不同,ArrayList是一个动态数组,而LinkedList是一个双向链表。所以它除了有ArrayList的基本操作方法外还额外提供了get,remove,insert方法在LinkedList的首部或尾部。由于实现的方式不同,LinkedList不能随机访问,它所有的操作都是要按照双重链表的需要执行。在列表中索引的操作将从开头或结尾遍历列表(从靠近指定索引的一端)。这样做的好处就是可以通过较低的代价在List中进行插入和删除操作。 与ArrayList一样,LinkedList也是非同步的。如果多个线程同时访问一个List,则必须自己实现访问同步。
import java.util.LinkedList;
public class Test7 {
public static void main(String[] args) {
TeamList list = new TeamList();
list.add(“zp”);
list.add(“hyy”);
list.add(“yyyy”);
// 逆序:先进后出
// int size = list.size();
// for (int i = 0; i < size; i++) {
// System.out.println(list.pop());
// }
// 正序:先进先出
int size = list.size();
for (int i = 0; i < size; i++) {
System.out.println(list.remove());
}
LinkedList l = new LinkedList<>();
l.descendingIterator();
}
}
class StackList {
LinkedList list;
public StackList() {
list = new LinkedList();
}
// 进栈
public void add(Object o) {
list.push(o);
}
// 弹栈 : 把元素删除并返回。
public Object pop() {
return list.pop();
}
// 获取元素个数
public int size() {
return list.size();
}
}
class TeamList {
LinkedList list;
public TeamList() {
list = new LinkedList();
}
public void add(Object o) {
list.offer(o);
}
public Object remove() {
return list.poll();
}
// 获取元素个数
public int size() {
return list.size();
}
}
Vector
和ArrayList类似,但属于强同步类。如果你的程序本身是线程安全的(thread-safe,没有在多个线程之间共享同一个集合/对象),那么使用ArrayList是更好的选择。.同步(线程安全) 有句话叫越安全,效率就越低。
总结::
1.ArrayList是实现了基于动态数组的数据结构,LinkedList基于链表的数据结构。
2.对于随机访问get和set,ArrayList觉得优于LinkedList,因为LinkedList要移动指针。
3.对于新增和删除操作add和remove,LinedList比较占优势,因为ArrayList要移动数据。
这一点要看实际情况的。若只对单条数据插入或删除,ArrayList的速度反而优于LinkedList。但若是批量随机的插入删除数 据,LinkedList的速度大大优于ArrayList. 因为ArrayList每插入一条数据,要移动插入点及之后的所有数据。
4.vector查询效率低,线程安全