List里ArrayList与LinkedList以及Vector之间的区别

本文主要介绍了List中ArrayList、LinkedList和Vector的区别。ArrayList基于动态数组,随机访问快,线程不安全;LinkedList是双向链表,增删操作有优势,同样线程不安全;Vector与ArrayList类似,但线程安全,不过查询效率低。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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查询效率低,线程安全

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值