1.介绍
List接口的定义为该接口实现是有序的Collection,该接口的实现可以对每个元素的插入位置进行精确的控制。用户可以根据元素的整数索引访问元素,并搜索列表中的元素。而且列表允许重复的元素,而且也允许null元素,其实现类有ArrayList,LinkedList,Vector,Stack,下面将详细介绍这些实现的异同。
2.类图结构
如上图所示,为实现List接口的实现的类图结构,其中List的实现类主要有以下几个:
- ArrayList:容量大小可变的数组,详细介绍请参考,JAVA学习-ArrayList详解
- LinkedList:实现List接口双向链表,详细介绍请参考,JAVA学习-LinkedList详解
- Vector:Vector与ArrayList一样也是可实现增长的对象数组
- Stack:Stack表示后进先出(LIFO)的对象堆栈
由于对来说Vector和Stack使用比较少,因此没有特地的篇幅去详细介绍它们的实现细节,下面会初略的介绍下Vector和Stack的实现原理。
3.Vector与Stack
3.1 Vector
3.1.1 定义
Vector 类可以实现可增长的对象数组。与数组一样,它包含可以使用整数索引进行访问的组件。但是,Vector 的大小可以根据需要增大或缩小,以适应创建 Vector 后进行添加或移除项的操作
3.1.2 结构及实现
如下图所示为Vector的类图结构,其实可以发现与ArrayList并没有很大的区别,而且Vector的内部实现与ArrayList也是大同小异,所以在这里就不做详细的介绍了,值得注意的有如下几点:
- Vector初始化容量为10
- Vector是线程安全的,通过源码可以发现Vector中的方法基本都使用关键字synchronized修饰
3.2 Stack
3.2.1 定义
Stack类表示先进后出的堆栈,通过五个操作对类Vector进行了扩展。
3.2.2 结构及实现
如下图所示,Stack是Vector的子类,其实现比较简单,主要有push,pop,peek,empty,search这五个操作,值得注意的是其初始化容量为0
4.List实现类对比
1.实现
- ArrayList:内部实现是数组
- LinkedList:内部实现是双向链表
- Vector:内部实现是数组
- Stack:Vector的子类,内部实现是数组
2.线程安全
- ArrayList:线程不安全的
- LinkedList:线程不安全的
- Vector:线程安全的
- Stack:线程安全的
3.性能
在JAVA学习-LinkedList详解一文中有比较ArrayList与LinkedList在性能上的区别,对于Vector与Stack,如果不是特定的场景必须使用,建议还是使用ArrayList与LinkedList。
5.总结
本文是对前面所写有关List实现类的总结,希望能更好的理解各个List实现类的内部原理及应用场景,在开发中能够好的运用,如有问题,请指正!