深入浅析Java中的 List类
更新时间:2023-12-02一、 List概述及基本使用
Java中的List接口继承了Collection接口,是一种有序的集合类型,可以存储重复元素。
public interface List extends Collection {
// 集合中元素的个数
int size();
// 判断集合是否为空
boolean isEmpty();
// 判断集合是否包含某个元素
boolean contains(Object o);
// 添加元素
boolean add(E e);
// 移除元素
boolean remove(Object o);
// 清空集合中所有元素
void clear();
}
其中,List接口特有的方法有:
// 根据索引获取元素
E get(int index);
// 根据索引替换元素
E set(int index, E element);
// 在指定位置插入元素
void add(int index, E element);
// 移除指定位置的元素
E remove(int index);
// 获取子集合
List subList(int fromIndex, int toIndex);
// 获取元素在集合中的索引位置
int indexOf(Object o);
// 获取元素在集合中最后一次出现的索引位置
int lastIndexOf(Object o);
下面是List基本用法的示例代码:
List<String> list = new ArrayList<>();
list.add("A");
list.add("B");
list.add("C");
list.add("D");
for (String s : list) {
System.out.println(s);
}
二、 ArrayList和LinkedList的区别
ArrayList和LinkedList都是List的实现类,但它们的实现方式不同。
ArrayList底层是数组,适用于查找和随机访问操作,但插入和删除操作会导致元素的移动,效率较低。
LinkedList底层是链表,适用于插入和删除操作,但随机访问的效率较低。
下面是ArrayList和LinkedList的示例代码:
// ArrayList示例代码
List<String> arrayList = new ArrayList<>();
arrayList.add("A");
arrayList.add("B");
arrayList.add("C");
arrayList.add("D");
for (String s : arrayList) {
System.out.println(s);
}
// LinkedList示例代码
List<String> linkedList = new LinkedList<>();
linkedList.add("A");
linkedList.add("B");
linkedList.add("C");
linkedList.add("D");
for (String s : linkedList) {
System.out.println(s);
}
三、 List的遍历方式
List的遍历方式有三种:for循环、迭代器和Lambda表达式。
// for循环示例
for (int i = 0; i < arrayList.size(); i++) {
System.out.println(arrayList.get(i));
}
// 迭代器示例
Iterator<String> iterator = arrayList.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
// Lambda表达式示例
arrayList.forEach(s -> System.out.println(s));
四、 List的排序和比较
List接口中提供了sort()方法来对元素进行排序,排序时需要保证元素实现了Comparable接口或者提供Comparator接口实现。
Comparable接口需要实现compareTo()方法,Comparator接口需要实现compare()方法。
下面是List排序和比较的示例代码:
// Comparable示例
class Student implements Comparable<Student> {
private int age;
private String name;
public Student(int age, String name) {
this.age = age;
this.name = name;
}
public int getAge() {
return age;
}
public String getName() {
return name;
}
@Override
public int compareTo(Student o) {
return this.age - o.getAge();
}
}
List<Student> list = new ArrayList<>();
list.add(new Student(20, "Tom"));
list.add(new Student(18, "Jerry"));
list.add(new Student(25, "John"));
Collections.sort(list);
for (Student s : list) {
System.out.println(s.getName() + "," + s.getAge() + "岁");
}
// Comparator示例
Comparator<String> comparator = (o1, o2) -> o2.compareTo(o1);
Collections.sort(arrayList, comparator);
for (String s : arrayList) {
System.out.println(s);
}