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]);
}