List 集合代表一个元素有序、可重复的集合,集合中的每个元素都有对应的顺序索引。
本文包含如下内容:
- java 8 改进的List 接口和 ListIterator 接口
- ArrayList 和 Vector 实现类
- 固定长度的 List
1. java 8 改进的List 接口和 ListIterator 接口
List 作为 Collection 接口的子接口,当然可以使用 Collection 接口里的全部方法。而且由于 List 是有序集合,因此List 集合里增加了一些根据索引来操作集合元素的方法。
List 对象判断两个元素是否相等也是通过 equals() 方法进行比较,若返回true 即可删除。
可以看出,程序试图删除一个 A 对象时,List 会调用 A 对象的 equals() 方法依次与集合元素进行比较,如果该方法返回 true ,那么就删除,此处重写了 equals() 方法,使其总是返回true ,所以每次都删除第一个元素。
Java 8 为List 集合新增了 sort() 和 replaceAll() 方法
其中 sort() 方法需要一个 Comparator 对象控制元素排序,程序可以使用 Lambda 表达式作为参数;
而 replaceAll() 方法需要一个 UnaryOperator 来替换所有集合元素,UnaryOperator 也是一个函数式接口,因此程序可使用 Lambda表达式作为参数。
2. ArrayList 和 Vector 实现类
ArrayList 和 Vector 类都是基于数组实现的 List 类,所以 ArrayList 和 Vector 类封装了一个动态的、允许再分配的 Object[ ] 数组。ArrayList 或 Vector 对象使用 initialCapacity 参数来设置该数组的长度,当向 ArrayList 或 Vector 中添加元素超出了该数组的长度时,它们的 initialCapacity 会自动增加。
对于效率的考虑:
此外,ArrayList 和 Vector 还提供了如下两个方法来重新分配Object[ ] 数组。
Vector 中有一些重复的方法,比如 addElement(Object obj),实际上这个方法与add(Object obj)没有区别。实际上,Vector 有很多缺点,尽量少用。
ArrayList 和 Vector 的显著区别是:
- ArrayList 是线程安全的,当多个线程访问同一个ArrayList 集合时,如果有超过一个线程修改了ArrayList 集合,则程序必须手动保证该集合的同步性。
- Vector 集合是线程安全的,无需程序保证该集合的同步性,同时因为其线程安全的,所以其性能相比ArrayList 会低一些。
- 实际上,就算需要保证List 集合线程安全,也不推荐使用 Vector 实现类,可以通过Collections 工具类将ArrayList 变成线程安全的。
Vector 还提供了一个 Stack 子类,它用于模拟“栈”这种数据结构,进栈出栈的都是 Object,因此除非只使用Object 具有的操作,从栈中取出元素后必须进行类型转换,Stack 类提供了如下几个方法:
Stack 类同样是线程安全的,性能较差的,因此尽量少使用,如果需要使用“栈”这种数据结构,可以考虑使用后面将要介绍的ArrayDeque。
ArrayDeque 也是 List 的实现类,ArrayDeque 即实现了 List 接口,也实现了 Deque 接口,由于实现了 Deque 接口,因此可以作为栈来使用;而且 ArrayDeque 底层也是基于数组的实现,因此性能也很好。
3. 固定长度的 List
Arrays 工具类里提供了 asList(Object… a)方法,该方法可以把一个数组或指定个数的对象转换成一个 List 集合,这个 List 集合既不是ArrayList 实现类的实例,也不是Vector 实现类的实例,而是 Arrays 的内部类 ArrayList 的实例。
Arrays。ArrayList 是一个固定长度的List 集合,程序只能遍历访问该集合的元素,不可增加、删除该集合里的元素。