List
约 728 字大约 2 分钟
2024-08-08
在集合类中,List 是最基础的一种集合:它是一种有序列表
List 的行为和数组几乎完全相同:List 内部按照放入元素的先后顺序存放,每个元素都可以通过索引确定自己的位置,List 的索引和数组一样,从 0 开始
List<E> 接口
查看 List<E> 接口,我们可以看到几个主要的接口方法:
在末尾添加一个元素:
boolean add(E e)在指定索引添加一个元素:
boolean add(int index, E e)删除指定索引的元素:
int remove(int index)删除某个元素:
int remove(Object e)获取指定索引的元素:
E get(int index)获取链表大小(包含元素的个数):
int size()
实现 List 接口并非只能通过数组(即 ArrayList 的实现方式)来实现,另一种 LinkedList 通过"链表"也实现了 List 接口。在 LinkedList 中,它的内部每个元素都指向下一个元素
ArrayList 和 LinkedList 比较
| ArrayList | LinkedList | |
|---|---|---|
| 获取指定元素 | 速度很快 | 需要从头开始查找元素 |
| 添加元素到末尾 | 速度很快 | 速度很快 |
| 在指定位置添加/删除 | 需要移动元素 | 不需要移动元素 |
| 内存占用 | 少 | 较大 |
List 特点
List内部元素可重复允许添加
null
创建 List
List<String> list = new ArrayList<>();遍历 List
我们可以通过下标循环遍历 List 内容
public static void main(String[] args) {
List<String> list = Arrays.asList("A", "B", "C");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}但这种方式并不推荐,一是代码复杂,二是因为 get(int) 方法只有 ArrayList 的实现是高效的,换成 LinkedList 后,索引越大,访问速度越慢
我们应该使用迭代器 Iterator 来访问 List,Iterator 对象知道如何遍历一个 List,并且不同的 List 类型,返回的 Iterator 对象实现也是不同的,但总是具有最高的访问效率
Iterator 对象有两个方法
boolean hasNext()判断是否有下一个元素E next()返回下一个元素
public static void main(String[] args) {
List<String> list = Arrays.asList("A", "B", "C");
for (Iterator<String> it = list.iterator(); it.hasNext(); ) {
System.out.println(it.next());
}
}由于 Iterator 遍历是如此常用,所以,Java 的 for each 循环本身就可以帮我们使用 Iterator 遍历
public static void main(String[] args) {
List<String> list = Arrays.asList("A", "B", "C");
for (String str : list) {
System.out.println(str);
}
}List 和 Array 转换
把 List 变为 Array 有两种方法
第一种是调用 toArray() 方法直接返回一个 Object[] 数组
public static void main(String[] args) {
List<String> list = Arrays.asList("A", "B", "C");
Object[] arrays = list.toArray();
}这种方法会丢失类型信息,所以实际应用很少
第二种方式是给 toArray(T[]) 传入一个类型相同的 Array,List 内部自动把元素复制到传入的 Array 中
public static void main(String[] args) {
List<String> list = Arrays.asList("A", "B", "C");
String[] arrays = list.toArray(new String[3]);
}