java.util.List 接口继承自 Collection 接口,是单列集合的一个重要分支,习惯性的会将实现了 List 接口的类称为 List 集合。在 List 集合中允许出现重复的元素,所有的元素是以一种线性方式进行储存的,在程序中可以通过索引来访问集合中的指定元素。另外,List 集合还有一个特点就是元素有序,即元素的存入顺序和取出顺序一致。
一、List 接口
List 作为 Collection 接口的子接口,当然可以使用 Collection 接口里的全部方法。而且由于 List 是有序集合,因此 List 集合里增加了一些根据索引来操作集合元素的方法。
1.1 常用方法
方法名 | 说明 |
---|---|
void add(int index,Object element) | 将元素 element 插入到 List 集合的 index 处 |
boolean addAll(int index,Collection c) | 将集合 c 所包含的所有元素都插入到 List 集合的 index 处 |
Object get(int index) | 返回集合 index 索引处的元素 |
int indexOf(Object o) | 返回对象 o 在 Lis t集合中第一次出现的位置索引 |
int lastIndexOf(Object o) | 返回对象 o 在 List 集合中最后一次出现的位置索引 |
Object remove(int index) | 删除并返回 index 索引处的元素 |
Object set(int index,Object element) | 将 index 索引处的元素替换成 element 对象,返回被替换的旧元素 |
List subList(int fromIndex,int tolndex) | 返回从索引 fromlndex(包含)到索引 tolndex(不包含)处所有集合元素组成的子集合 |
void replaceAll(UnaryOperator operator) | 根据 operator 指定的计算规则重新设置 List 集合的所有元素 |
void sort(Comparator c) | 根据Comparator参数对 List 集合的元素排序 |
1.2 示例
public class DemoArrayList {
public static void main(String[] args) {
//多态,创建集合
List<String> list = new ArrayList<>();
//添加数据
list.add("a");
list.add("b");
list.add("c");
list.add("b");
//使用普通for遍历数组
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
二、ArrayList 集合 与 Vector 集合
2.1 ArrayList 集合
ArrayList 以数组的形式保存集合中的元素,能够根据索引位置随机且快速地访问集合中的元素。ArrayList 是线程不安全的,当多个线程访问同一个 ArrayList 集合时,如果有超过一个线程修改了 ArrayList 集合,则程序必须手动保证该集合的同步性。
2.2 Vector 集合
Vector 集合是线程安全的,无须程序保证该集合的同步性。因为 Vector 是线程安全的,所以 Vector 的性能比 ArrayList 的性能要低。实际上,即使需要保证 List 集合线程安全,也同样不推荐使用 Vector 实现类。Collections 工具类可以将一个 ArrayList 变成线程安全的。
Vector 还提供了一个 Stack 子类,它用于模拟“栈”这种数据结构,“栈”通常是指“后进先出”(LIFO)的容器。最后 “push” 进栈的元素,将最先被 “pop” 出栈。与 Java 中的其他集合一样,进栈出栈的都是 Object,因此从栈中取出元素后必须进行类型转换,除非你只是使用 Object 具有的操作。所以 Stack 类里提供了如下几个方法:
Object (peek)
:返回“栈”的第一个元素,但并不将该元素“pop”出栈。
Object pop()
:返回“栈”的第一个元素,并将该元素“pop”出栈。
void push(Object item)
:将一个元素“push”进栈,最后一个进“栈”的元素总是位于“栈”顶。
由于 Stack 继承了 Vector,因此它同样是线程安全的、性能较差的,因此应该尽量少用 Stack 类。
三、Collections 工具类
Java 提供了一个操作 List、Set 和 Map 等集合的工具类:Collections,该工具类里提供了大量方法对集合元素进行排序、查询和修改等操作。
3.1 常用方法
方法名 | 说明 |
---|---|
static void reverse(List list) | 反转指定 List 集合中元素的顺序 |
static void shuffle(List list) | 对 List 集合元素进行随机排序 |
static void sort(List list) | 根据元素的自然顺序对指定 List 集合的元素按升序进行排序 |
static void sort(List list,Comparator c) | 根据指定 Comparator 产生的顺序对 List 集合元素进行排序 |
static void swap(List list,int i,int j) | 将指定 List 集合中的 i 处元素和 j 处元素进行交换 |
static int binarySearch(List list,Object key) | 使用二分搜索法搜索指定的 List 集合,以获得指定对象在 List 集合中的索引。如果要使该方法可以正常工作,则必须保证 List 中的元素已经处于有序状态 |
static Object max(Collection coll) | 根据元素的自然顺序,返回给定集合中的最大元素 |
static Object max(Collection coll,Comparator comp) | 根据 Comparator 指定的顺序,返回给定集合中的最大元素 |
static Object min(Collection coll) | 根据元素的自然顺序,返回给定集合中的最小元素 |
static Object min(Collection coll,Comparator comp) | 根据 Comparator 指定的顺序,返回给定集合中的最小元素 |
static void fill(List list,Object obj) | 使用指定元素obj 替换指定 List 集合中的所有元素 |
static int frequency(Collection c,Objecto) | 返回指定集合中指定元素的出现次数 |
static int indexOfSubList(List source,List target) | 返回子 List 对象在父 List 对象中第一次出现的位置索引;如果父 List 中没有出现这样的子 List,则返回 -1 |
static int lastIndexOfSubList(List source,List target) | 返回子 List 对象在父 List 对象中最后一次出现的位置索引;如果父 List 中没有出现这样的子 List,则返回 -1 |
static boolean replaceAll(List list,Object oldVal,Object newVal) | 使用一个新值 newVal 替换 List 对象的所有旧值 oldVal |
3.2 Comparator
强行对某个对象 collection 进行整体排序的比较函数 。 可以将比较器传递给排序方法(如 Collections.sort 或 Arrays.sort ),以便对排序顺序进行精确控制。还可以使用 Comparator 来控制某些数据结构(如有序 Set 或有序映射)的顺序,或者为那些没有自然顺序的对象 collection 提供排序。当且仅当对于一组元素 S 中的每个 e1 和 e2 而言,c.compare(e1, e2) == 0 与 e1.equals(e2) 具有相等的布尔值时,Comparator c 强行对 S 进行的排序才叫做与 equals 一致的排序。
3.2.1 常用方法
方法名 | 说明 |
---|---|
int compare(T o1, T o2) | 比较其两个参数的顺序,返回负整数/零/正整数,因为第一个参数小于/等于/大于第二个参数 |
boolean equals(Object obj) | 指示某个其他对象是否等于此比较器,该方法必须遵守 Object.equals(Object) 的一般合同。 另外, 只有指定的对象也是一个比较器,这个方法只能返回 true ,并且它与这个比较器的顺序相同 |
3.2.2 示例
public class CollectionsDemo3 {
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<String>();
list.add("cba");
list.add("aba");
list.add("sba");
list.add("nba");
// 根据首字母排序
Collections.sort(list, new Comparator<String>() {
@Override
public int compare(String s1, String s2) {
// 升序
return s1.charAt(0) - s2.charAt(0);
// return s1.charAt(0).compareTo(s2.charAt(0));
// 降序
// return s2.charAt(0) - s1.charAt(0);
// return s2.charAt(0).compareTo(s1.charAt(0));
}
});
System.out.println(list);
}
}
补充:定长 List
数组的工具类:Arrays,该工具类里提供了 asList(Object…a) 方法,该方法可以把一个数组或指定个数的对象转换成一个 List 集合,这个 List 集合既不是 ArrayList 实现类的实例,也不是 Vector 实现类的实例,而是 Arrays 的内部类 ArrayList 的实例。Arrays$ArrayList 是一个固定长度的 List 集合,程序只能遍历访问该集合里的元素,不可增加、删除该集合里的元素。