集合之List
1.介绍
众所周知List,Set,MAp,前两个都是继承了Collection接口,Map为独立接口,这篇文章着重讲解List接口,的实现类和它们的特点及应用。
List的实现类有哪些?
1.ArrayList
2.Vectior
3.LinkedList
2.ArrayList原理
概念
ArrayList底层是数组实现,ArrayList只不过是对数组的包装,因为数组在内存中分配时必须指定长度,
且一旦分配好后便无法再增加长度,ArrayList之所以可以一直往里添加,是因为它内部做了处理。存储
空间连续,当容量达到阈值时会进行自动扩容(数组当前足够的最小容量 * 1.5),当底层数组填满后,它会
再分配一个更大的新的数组,把原数组里的元素拷贝过来,然后把原数组抛弃掉。使用新的数组作为底
层数组来继续存储。
特点
1.查询快,增删慢,线程不安全,运行效率高。
2.可以储存任意类型的元素
3.元素有序,右下标,可重复
4.实现随机访问
3.LinkedList原理
概念
LinkedList底层是链表实现,长度不固定,因为内存空间的分配是由操作系统完成的,可以说每次分配的位
置都是随机的,并没有确定的规律。所以说链表的每个元素都在完全不同的内存地址,上一个元素除了存
储具体的数据之外,也存储一份下一个元素在内存中的地址,访问链表元素时,必须从头一个个遍历,而
且链表越长,位置越靠后,所需花费的时间就越长。所以按索引访问链表元素的时间复杂度就是O(n),
n为链表的长度。也说明了链表不支持随机访问。所以ArrayList就实现了RandomAccess(随机访问)
接口,而LInkedList就没有。
特点
1.查询慢,增删快
2.没有同步,线程不安全(可以通过Collections.synchronizedList()实现线程安全)
3.底层数据结构是链表
4.Vector
介绍
和ArrayList一样底层是数组实现,在多线程的情况下,线程是安全的,效率低,Vector出现与jdk1.0,继承了AbstractList类(继承后可以使用迭代器遍历),实现了RandomAccess(标记接口,标明实现该接口的list支持快速随机访问),cloneable接口(标识接口,合法调用clone方法),serializable(序列化标识接口)。
特点
1.数组实现。
2.可以随机访问。
3.线程安全,效率低。