从零开始学Java-单列集合:List

166 阅读4分钟

在上一篇文章中我们讲解了单列集合的顶层Collection,那下面我们就来学习一下第一种List系列的单列集合吧,本文将详细的介绍List集合。

List集合

List集合特点

  1. 有序:存和取的元素顺序一致。
  2. 有索引:可以通过索引操作元素
  3. 可重复:存储的元素可以重复

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集合的遍历方法

  1. 迭代器遍历
  2. 列表迭代器遍历(独有的)
  3. 增强for遍历
  4. Lambda表达式遍历
  5. 普通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) + " ");
}

我们来运行看一下吧:

image.png

是不是都全部遍历出来了呀!到这里List的五种遍历方式就学习完毕啦,这么多我到底什么时候用哪种呢,好乱呀!不着急,我们下面来总结一下:

总结

  1. 迭代器遍历:在遍历的过程中需要删除元素,可以使用迭代器。
  2. 列表迭代器遍历:在遍历的过程中需要添加元素,可以使用列表迭代器。
  3. 增强for遍历、Lambda遍历:仅仅想遍历,那么可以使用这两个。
  4. 普通for遍历:如果遍历的时候想要操作索引,可以使用普通for

ArrayList集合

基于动态数组实现,支持快速随机访问元素,但在插入和删除时可能需要移动大量元素。

ArrayList底层原理

  1. 利用空参创建的集合,在底层创建一个默认长度为0的数组。(数组名:elementData)
  2. 添加第一个元素时,底层会创建一个新的长度为10的数组。(添加完第一个元素才会创建) image.png
  3. 存满时,会自动扩容原来的1.5倍。
  4. 如果一次添加多个元素,1.5倍还放不下。就会新创建数组,长度以实际为准。

LinkedList集合

  • LinkedList:基于链表实现,插入和删除操作更快,但随机访问相对较慢。

LinkedList底层原理

  1. 底层数据结构是双链表。查询慢,增删快,但是如果操作的是首尾元素,速度也是极快的。 image.png 我们来看一下底层源码看一下:

    image.png 是不是有3个变量呀!

  2. 底层数据结构是双链表。查询慢,首尾操作的速度是极快的,所以多了很多首尾操作的特有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集合,我们下期不见不散!!!

==最后非常感谢您的阅读,也希望能得到您的反馈  ==