Java-集合第三篇List集合
1、List集合
有序可重复集合,集合中的每个元素都有其对应的顺序索引。
2、List相对于Collection额外提供的方法:
1》void add(int index,Object element):将元素element插入到List集合的index处。
2》boolean assAll(int index,Collection c):将集合c所包含的所有元素都插入到List集合的index处。
3》Object get(int index):返回集合index索引处的元素。
4》int indexOf(Object o):返回对象o在集合List中第一次出现的位置索引。
5》int lastIndex(Object o):返回对象o在List集合中最后一次出现的位置索引。
6》Object remove(int index):删除并返回index索引处的元素。
7》Object set(int index,Object element):将index索引处的元素替换成element对象,返回被替换的旧元素。
8》List subList(int fromIndex,int toIndex):返回从索引fromIndex(包含)到索引toIndex(不包含)处所有集合元素组成的子集合。
与Set相比,List增加了根据索引来插入、替换、删除集合元素的方法。Java 8还为List增加了两个默认方法:
9》void replaceAll(UnaryOperator operator):根据operator指定的计算规则重新设置List集合的所有元素。
10》void sort(Comparator c):根据Comparator参数对List集合的元素排序。
3、List判断两个对象相等只要通过equals()方法比较true即可。
4、当调用List的set(int index,Object element)方法来改变List集合指定索引处的元素时,指定的索引必须是List集合有效的索引。
即set(int index,Object element)方法不会改变List集合的长度。
5、ListIterator
List还额外提供了一个listIterator()方法,该方法返回一个ListIterator对象。ListIterator接口继承了Iterator接口,提供了专门操作List的方法。ListIterator接口在Iterator接口基础上增加了如下方法:
1》boolean hasPrevious():返回该迭代器关联的集合是否还有上一个元素。
2》Object previous():返回该迭代器的上一个元素。
3》void add(Object o):在指定位置插入一个元素。
即ListIterator增加了向前迭代的功能(Iterator只有向后迭代),ListIterator还可以通过add()方法向List集合添加元素(Iterator只能删除元素)。
6、ArrayList和Vector实现
(1)ArrayList和Vector类都是基于数组实现的List类,所以ArrayList和Vector类封装了一个动态的、允许再分配的Object[]数组。ArrayList或Vector通过initialCapacity参数来设置该数组的长度,当向ArrayList或Vector中添加元素超出了该数组的长度时,它们的initialCapacity会自动增加。一般不需理会initialCapacity,当需要增加大量的元素时,可以使用ensureCapacity(int minCapacity)方法一次性曾增加initialCapacity。还可以减少重分配的次数,从而提高性能。
AarrayList和Vector提供了如下两个方法重新分配Object[]数组
1》void ensureCapacity(int minCapacity):将ArrayList或Vector集合的Object[]数组长度增加大于或等于minCapacity值。
2》void trimToSize():调整ArrayList或Vector集合中Object[]数组长度为当前元素的个数。调用该方法可以减少集合对象占用的存储空间。
(2)ArrayList作为List的主要实现类。Vector属于在集合框架出来之前的产物,缺点比较多,不推荐使用。
(3)ArrayList与Vector一个显著区别:ArrayList不是线程安全的,但Vectory则是线程安全的。ArrayList可以通过Collections工具类的包装编程线程安全的。
(4)Vector提供了一个Stack子类(也是线程安全的),用于模拟“栈”这种数据结构(后进先出)。进栈出栈都是Object,因此从栈中取元素后必须进行类型转换,Stack提供的方法有:
1》Object peek():返回“栈”的第一个元素,但并不将该元素“pop”出栈。
2》Object pop():返回“栈”的第一个元素,并将该元素“pop”出栈。
3》void push(Object item):将一个元素“push”进栈,最后一个进栈的元素总是位于栈顶。
Stack同样存在性能问题,可以替代的选择是ArrayDeque。ArrayDeque也是List的实现类,ArrayDeque既实现了List接口,也实现了Deque接口,由于实现了Deque接口,因此可以作为栈来使用。而且ArrayDeque底层也是基于数组实现的,因此性能也很好。
7、固定长度的List
操作数组的工具类Arrays,提供了asList(Object... a)方法,该方法可以把一个数组或指定个数的对象转换成一个List集合,这个List既不是ArrayList实现类的实例,也不是Vector实现类的实例,而是Arrays的内部类ArrayList的实例。
Arrays.ArrayList是一个固定长度的List集合,程序只能遍历访问该集合中的元素,不可增加、删除该集合中的元素。