本文主要讲Collection接口之一List接口及其实现类。
List集合,特点:有序,可重复
与上文中Set不同的是,List集合是有序的,这种顺序表现在:通过索引的形式,记录了元素的添加顺序。
List接口的实现类,如图所示:
1. ArrayList 与数组有关吗?
2.Vector
3.LinkedList
上文研究Set集合的时候,了解到LinkedHashSet是通过链表的形式将hash算法存储的元素链接起来,这里是不是将:带有索引的List集合也通过链表的形式,连接起来呢?
从图中看出,实现了deque接口,猜测应该会实现双向队列的效果把。
待我慢慢道来.......
一、List接口和ListIterator接口
List接口的特点在于通过“索引”记录了元素的添加顺序。因此相比较起父接口Collection而言,添加了一些根据索引操作集合元素的方法。
额外添加了专门操作List的方法:listIterator()
listIterator与Iterator对比:listIterator增加了向前迭代的功能(Iterator只能向后迭代),增加了通过add方法向List集合中添加元素(Iterator只能删除元素)
public class TestlistIterator { public static void main(String[] args) { String[] books = {"englishbook","computerbook","musicbook"}; List bookList = new ArrayList(); for (int i = 0; i < books.length; i++) { bookList.add(books[i]); } ListIterator bookListIterator = bookList.listIterator(); while(bookListIterator.hasNext()){ System.out.println("book正向迭代:"+bookListIterator.next()); bookListIterator.add("---------分隔符--------------"); } System.out.println("-------下面开始反向迭代----------------"); while(bookListIterator.hasPrevious()){ System.out.println("book反向迭代:"+bookListIterator.previous()); } } }
结果如下:
二、ArrayList和Vector实现类
1. 相同点:
都是基于数组实现的List类,所以封装了一个动态再分配的Object[]数组。通过属性capacity表示长度,且会自动增长。
若添加大量元素,可使用ensureCapacity一次性添加capacity。甚至是直接指定capacity的大小,从而减少重新分配的次数,提高性能。
2. 不同点:
简单理解为新的ArrayList替代旧的Vector的功能。
ArrayList是线程不安全,Vector线程安全(性能较高,但不建议使用)
Stack是Vector的子类,模拟“栈”数据结构,LIFO。
LinkedList基于链表实现List类,优化顺序访问,特别是:插入、删除,速度非常快。(同时实现Deque接口,双向队列)
三、固定长度的List
操作数据的工具类Arrays.asList(.....)将数组转化为List集合【此时为Arrays内部类ArrayList的实例】
注意:此时长度已经固定了!不可改变
四、性能排名榜
各容器性能对比,主要取决于集合的底层实现,是:数组/链表
插入、删除、迭代时:数组 <
链表。
随机访问:数组 >
链表。(数组,连续内存区)