一.List与vector的区别
1.在c++中:
stl 提供了3个最基本的容器:vector, list, deque.
vector: 与数组类似,有一段连续的存储空间,非常好的支持随即存取。但插入和删除操作会造成内存块拷贝。当内存空间不够时需要申请一块足够大的内存并拷贝。
list: 与双向链表类似,内存空间不连续,通过指针进行访问。随即访问没效率,插入和删除有效率。
deque:支持随即存取,效率与vector差不多。支持在两端 push_back, push_front, pop_back, pop_front,效率和list差不多。
2.在java中:
Collection[I]
+--java.util.Set[I]
+--java.util.List[I]
+--java.util.ArrayList[C]
+--java.util.LinkedList[C]
+--java.util.Vector[C]
+java.util.Stack[C]
所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。
List: 是有序的Collection。与Set不同的是,List允许有相同的元素。除了具有Collectiong接口必备的iterator()外,List还提供listIterator()方法,返回一个ListIterator接口,和标准的接口相比,多了添加,删除,向前向后遍历等。
ArrayList: 内部通过数组实现,实现了基于动态数组的数据结构,允许随即访问get和set。当数组需要增长时,新的容量大概大概会增加50%,这就意味着一个包含大量元素的ArrayList对象,最终会有很大的空间被浪费掉。当数组大小不满足时需要增加存储能力,需要将已有数组的数据复制到新的存储空间中,这将导致性能急剧下降。Arraylist没有同步。
LinkList: 对于remove,insert,LinkList比较占优势,只需修改指针即可。LinkList中还有next和previous两个元素,这在一个LinkList结构中将有很大的空间开销。提供list接口没有定义的方法,get,remove,insert 操作表头和表尾。LinkList没有同步方法,可多线程同时访问一个List。
Vector: 与ArratList一样,通过数组实现,不同的是它支持线程同步。即某一时刻只有一个线程能够写Vector。但实现线程同步需要高花费,访问它比访问ArratList慢。
关于ArrayList和Vector区别如下:
- ArrayList在内存不够时默认是扩展50% + 1个,Vector是默认扩展1倍。
- Vector提供indexOf(obj, start)接口,ArrayList没有。
- Vector属于线程安全级别的,但是大多数情况下不使用Vector,因为线程安全需要更大的系统开销。