在上一篇文章中我们讲解了单列集合的顶层Collection,那下面我们就来学习一下第一种List系列的单列集合吧,本文将详细的介绍List集合。
List集合
List集合特点
- 有序:存和取的元素顺序一致。
- 有索引:可以通过索引操作元素
- 可重复:存储的元素可以重复
List集合的方法
- Collection的方法List都继承了
- List集合因为有索引,所以多了很多索引操作的方法。
| 方法名 | 说明 |
|---|---|
| void add(int index,E element) | 在此集合中的指定位置插入指定的元素 |
| E remove(int index) | 删除指定索引处的元素,返回被删除的元素 |
| E set(int index,E element) | 修改指定索引处的元素,返回被修改的元素 |
| E get(int index) | 返回指定索引处的元素 |
代码演示
- 先来创建一个集合并添加元素
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
System.out.println(list);
void add(int index,E element) 在指定的位置插入指定的元素
// 细节:原来索引上的元素会往后移一位
list.add(1,"qqq");
System.out.println(list); // [aaa, qqq, bbb, ccc]
E remove(int index) | 删除指定索引处的元素,返回被删除的元素
String result = list.remove(0);
System.out.println(result); // aaa
E set(int index,E element) | 修改指定索引处的元素,返回被修改的元素
String result1 = list.set(0, "zzz");
System.out.println(result1); // qqq
System.out.println(list); // [zzz, qqq, bbb, ccc]
E get(int index) | 返回指定索引处的元素
String result2 = list.get(0);
System.out.println(result2); // zzz
List集合的遍历方法
- 迭代器遍历
- 列表迭代器遍历(独有的)
- 增强for遍历
- Lambda表达式遍历
- 普通for循环
下面我们也来演示一下吧:
代码演示
- 先来创建一个集合并添加元素
List<String> list = new ArrayList<>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
System.out.println(list);
- 迭代器遍历
System.out.print("迭代器遍历:");
Iterator<String> it = list.iterator(); // 创建指针
while (it.hasNext()){ // 判断是否有元素
String str = it.next(); // 获取元素,移动指针
System.out.print(str + " ");
}
- 列表迭代器遍历
System.out.print("列表迭代器遍历:");
// 获取一个列表迭代器对象,里面的指针默认也是指向0索引的。
ListIterator<String> it1 = list.listIterator();
while (it1.hasNext()){
String str = it1.next();
System.out.print(str + " ");
}
listIterator这个方法额外添加了一个方法,在遍历的过程中,可以添加元素。我们来看一下吧:
if("bbb".equals(str)){
it1.add("qqq");
}
表示把qqq添加到bbb的后面。
- 增强for遍历
for (String str : list) {
System.out.print(str + " ");
}
- Lambda表达式遍历
list.forEach((str)-> System.out.print(str + " "));
- 普通for循环
System.out.print("普通for循环:");
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i) + " ");
}
我们来运行看一下吧:
是不是都全部遍历出来了呀!到这里List的五种遍历方式就学习完毕啦,这么多我到底什么时候用哪种呢,好乱呀!不着急,我们下面来总结一下:
总结
- 迭代器遍历:在遍历的过程中需要删除元素,可以使用迭代器。
- 列表迭代器遍历:在遍历的过程中需要添加元素,可以使用列表迭代器。
- 增强for遍历、Lambda遍历:仅仅想遍历,那么可以使用这两个。
- 普通for遍历:如果遍历的时候想要操作索引,可以使用普通for
ArrayList集合
基于动态数组实现,支持快速随机访问元素,但在插入和删除时可能需要移动大量元素。
ArrayList底层原理
- 利用空参创建的集合,在底层创建一个默认长度为0的数组。(数组名:elementData)
- 添加第一个元素时,底层会创建一个新的长度为10的数组。(添加完第一个元素才会创建)
- 存满时,会自动扩容原来的1.5倍。
- 如果一次添加多个元素,1.5倍还放不下。就会新创建数组,长度以实际为准。
LinkedList集合
LinkedList:基于链表实现,插入和删除操作更快,但随机访问相对较慢。
LinkedList底层原理
-
底层数据结构是双链表。查询慢,增删快,但是如果操作的是首尾元素,速度也是极快的。
我们来看一下底层源码看一下:
是不是有3个变量呀!
-
底层数据结构是双链表。查询慢,首尾操作的速度是极快的,所以多了很多首尾操作的特有API。
LinkedList特有方法
| 方法名 | 说明 |
|---|---|
| public void addFirst(E e) | 在该列表开头插入指定的元素 |
| public void addLast(E e) | 将指定的元素追加到此列表的末尾 |
| public E getFirst() | 返回此列表中的第一个元素 |
| public E getLast() | 返回此列表中的最后一个元素 |
| public EremoveFirst() | 从此列表中删除并返回第一个元素 |
| public E removeLast() | 从此列表中删除并返回最后一个元素 |
好啦,到这里单列集合的Collection的List系列就学习完毕啦,有什么不懂的可以在评论区互相探讨哟,我们下期来学习Collection的第二种Set集合,我们下期不见不散!!!
==最后非常感谢您的阅读,也希望能得到您的反馈 ==