List集合
List 集合是有序集合,元素可以重复,可以根据索引操作元素:
List 集合判断两个对象相等的标准是只要通过 equals() 方法比较返回 true 即可。当试图删除一个对象时,List 将会调用该对象的 equals() 方法依次与集合元素进行比较,如果该 equals() 方法以某个集合元素作为参数时返回 true,List 将会删除该元素。
Java8 为 List 集合增加了 sort() 和 replaceAll() 两个常用的默认方法:
- sort() 方法需要一个 Comparator 对象来控制元素排列。
- replaceAll() 方法需要一个 UnaryOperator 来替换所有集合元素。
List 还提供了一个 listIterator() 方法,该方法返回一个 ListIterator 对象,这是一个迭代器,该对象有如下方法:
- boolean hasPrevious():返回该迭代器关联的集合是否还有上一个元素。
- Object previous():返回该迭代器的上一个元素。
- void add(Object o):在指定位置插入一个元素。
ArrayList 和 Vector 实现类
ArrayList 和 Vector 作为 List 的两个实现类,完全支持 List 接口的全部功能。这两个实现类都是基于数组实现,所以 ArrayList 和 Vector 类封装了一个动态的、允许再分配的 Object[] 数组。使用 initialCapacity 参数来设置该数组的长度,默认长度是 10,当发生自动扩容时会自动增大到原来的 1.5 倍。
有如下方法可以重新分配 Object[] 数组:
- void ensureCapacity(int minCapacity):将 ArrayList 或 Vector 集合的 Object[] 数组长度增加大于或等于 minCapacity 值。
- void trimToSize():调整 ArrayList 或 Vector 集合的 Obje[] 数组长度为当前元素的个数,可以减少占用的存储空间。
ArrayList 和 Vector 的显著区别是:ArrayList 是非线程安全的。但是不推荐使用 Vector。后面可以利用 Collections 工具类把 ArrayList 包装成线程安全的。
固定长度的 List
在数组中有一个操作数组的工具类:Arrays,该工具类提供了 asList(Object… a) 方法,可以把一个数组或指定个数的对象转换成一个 List 集合,这个 List 既不是 ArrayList 实现类,也不是 Vector 实现类,而是 Arrays 的内部类 ArrayList 的实例。该 Arrays.ArrayList 是一个固定长度的 List 集合,程序只能遍历访问该集合里的元素,不可增减、删除该集合里的元素:1
2
3
4
5
6List fixedList = Arrays.asList("疯狂 Java 讲义","轻量级 Java EE 企业应用实战");
//获取 fixedList 的实现类,将输出 Array$ArrayList
System.out.pritntln(fixedList.getClass());
//使用方法引用遍历集合元素
fixedList.forEach(System.out::println);
//试图增加、删除元素都会引发 UnsupportedOperationexception