【Java学习笔记】:List接口以及实现类(ArrayList、LinkedList)

120 阅读3分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第6天,点击查看活动详情

1、写在前面

大家好,今天文章的内容是:

  • List集合:包括List接口以及实现类

2、List接口

2.1、介绍

List接口继承了Collection接口,是一个有序集合。其元素是按照顺序排列的,并且可以重复。List中的每个元素都有一个index值(索引值,从0开始),用于表示元素在List中的位置。我们可以将不同类型的对象添加到List中。注意,List接口在声明时应使用泛型,即List<E>

List接口的主要实现类包括:ArrayListLinkedList等。

2.2、使用

List接口位于java.util包中,因此我们在使用List前需要先导包。

语法如下:

import java.util.List;

下面是List接口拥有的一些方法:

image.png

2.3、创建List

我们可以通过ArrayList或者LinkedList来创建List

比如:

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(100);
        list.add(200);
        list.add(300);
        System.out.println(list);   // [100, 200, 300]
    }
}

2.4、遍历List

1)for + get

要遍历一个List集合,我们可以利用一个for循环加上get方法。如下所示:

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(100);
        list.add(200);
        list.add(300);
        for (int i=0; i<list.size(); i++) {
            int val = list.get(i);
            System.out.println(val);
        }
    }
}
// 运行结果:
// 100
// 200
// 300

2)Iterator

如果需要访问List中的元素,我们一般会使用Iterator(迭代器)来实现,因为这样访问的效率更高。

我们可以通过调用iterator()方法来创建Iterator对象。

这里记录两个实用方法:

  • boolean hasNext():判断Iterator对象是否有下一个元素
  • E next():返回Iterator对象的下一个元素

举一个例子:

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(100);
        list.add(200);
        list.add(300);
        Iterator<Integer> it = list.iterator();
        while(it.hasNext()) {
            int val = it.next();
            System.out.println(val);
        }
    }
}
// 运行结果:
// 100
// 200
// 300

3)For each

我们可以使用For each循环来遍历一个List集合。

这是因为Iterable接口定义了Iterator<E> iterator()方法,此时Java编译器在遍历集合类对象后,会自动把For each循环变成Iterator的调用,这样就会得到一个Iterator实例。因此只要实现了Iterable接口的集合类都可以直接用For each循环来遍历。

举个例子:

import java.util.ArrayList;
import java.util.List;

public class Test {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        list.add(100);
        list.add(200);
        list.add(300);
        for(int val : list) {
            System.out.println(val);
        }
    }
}
// 运行结果:
// 100
// 200
// 300

3、ArrayList

3.1、认识

ArrayList是一个数组队列,继承了AbstractList,实现了List接口。

我们知道数组的特点,就是容量如果在创建的时候确定了,就无法再改变了。但ArrayList类不一样,ArrayList在使用的过程中,可以随着存储需求的改变而进行扩充,可以说是一个动态修改的数组。这是ArrayList和普通数组的区别所在。另外,ArrayList类也提供了一系列简便的方法供我们使用。

备注:ArrayList类位于java.util包中,因此我们在使用ArrayList前需要先导包。语法如下。

import java.util.ArrayList;

3.2、方法

下面是ArrayList类的一些常用方法。

image.png

image.png

4、LinkedList

4.1、认识

LinkedList类与ArrayList不同,其采用链表结构来保存对象。

如果我们需要频繁向集合中插入或删除元素,则使用LinkedList类效率会更高,但缺点是LinkedList类随机访问元素的效率较低。

备注:LinkedList类位于java.util包中,因此我们在使用LinkedList前需要先导包。语法如下。

import java.util.LinkedList; 

4.2、方法

image.png

image.png

image.png

5、小结

  1. List集合中,元素允许重复出现,并且各元素之间的顺序就是对象插入的顺序。事实上这种行为和数组很接近。并且每个元素都有自己的索引值(索引值从零开始),我们可以通过索引值来访问List中的各个元素。
  2. ArrayList类实现了动态可变的数组,其允许保存所有元素(包括null),我们可以通过元素的索引值来对其进行随机访问。但缺点在于向指定的位置插入(或者删除)对象时效率不高。
  3. LinkedList类采用链表结构来保存对象,当我们需要频繁插入(或者删除)对象时就可以使用LinkedList类,此时效率较高。但对于LinkedList类来说,需要随机访问集合中的对象时,效率就不高。

6、写在最后

好了,今天就记录到这里,感谢观看。