Java基础之 List接口

一、List的特点和常用的方法

List是有序、可重复的容器。

有序:List中每个元素都是有索引标记。可以根据元素的索引标记访问元素,从而精确控制这些元素。

可重复:List运行加入重复的元素。更确切的讲,List通常允许满足e1.equals(e2)的元素重复加入容器。

之前Collection接口中的方法在List中都能用,还有一些List特有的跟索引有关的方法:
在这里插入图片描述
同时,List接口常用的实现类有3个,接下来我们一个个介绍。

二、ArrayList实现类

ArrayList底层是用数组实现的,我们可以理解为ArrayList是一个比较智能的数组,它会自动设数组长度,当长度不够用时会自动扩大数组长度。

特点:查询效率高,增删效率低,线程不安全。

1、用ArrayList实现一个List容器对象

我们先看一下源码:
在这里插入图片描述
我们看到,如果new一个实现类为ArrayList的容器对象时,传入的长度参数是多少,这个容器的长度就为多少,如果没有传入长度参数,那么这个容器的长度就为10。

2、add方法

先看源码
在这里插入图片描述
我们看到add方法有两种,一种只用传一个参数,一种要传两种。

第一种:只传一个参数,参数就是需要存入这个容器的值,看源码我们知道,这种方法就是简单的传入的参数放到数组的最后一个元素的后面。

第二种:传两个参数,index是传入参数存储的位置,element是传入的参数的值,简单来讲就是将这个element插入index这个位置。

3、set方法

看源码
在这里插入图片描述
set方法就是将index位置的元素替换成element。

4、get方法

看源码
在这里插入图片描述
get方法就是返回index这个位置存储的元素。

5、remove方法

看源码
在这里插入图片描述
我们发现也有两种,第一种是传入需要移除的元素的位置,
第二种是传入需要移除的元素的值。

第一种:直接找到这个位置,然后把后面的元素往前移一个位置,原先的最后一个元素的位置变为空,这时我们传入的位置的元素就被覆盖了,也就被移除了。

第二种:一个一个去对比,如果发现这个值,就以上面说的这个方法把它移除,但是这只能移除第一次出现的这个元素。如果传入的这个值为空,那么就查找元素之间插入的一个为空的位置,用后面的元素将这个位置填掉。

6、indexOf方法

看源码
在这里插入图片描述
indexOf返回就是查找传入的这个值对应的第一次出现的位置,如果没有差到就返回-1。

7、lastIndexOf方法

看源码
在这里插入图片描述
lastIndexOf方法查询的时候是从最后一个元素开始查的,也就是说他是返回这个元素最后一次出现的位置。

三、LinkedList实现类

LinkedList底层是用双向非循环链表实现的存储。

特点:查询效率低,增删效率高,线程不安全。

我们先来看看双向非循环链表是什么样的
在这里插入图片描述
它的每个数据节点都有两个指针,分别指向前一个节点和后一个节点。

1、add方法

看源码
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
add方法有四种种,boolean add(),addFirst(),addLast(),void add()。
boolean add():在链表的最后加一个元素,并返回true。
addFirst():在链表的第一个元素前面加一个元素。
addLast():在链表的最后加一个元素。
void add():在链表的固定位置插入一个元素。
插入的过程是这样的
在这里插入图片描述

2、set方法

看源码
在这里插入图片描述
set方法就是将固定位置的元素替换为传入的元素
在这里插入图片描述

3、get方法

看源码
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
get方法有三种,get(),getFirst(),getLast()。
get():返回指定位置的元素。
getFirst():返回第一个元素。
getLast():返回最后一个元素。

4、remove方法

看源码
在这里插入图片描述
在这里插入图片描述
同样三种,remove(),removeFirst(),removeLast()。
remove():移除指定位置的元素。
removeFirst():移除第一个元素。
removeLast():移除最后一个元素。

删除过程
在这里插入图片描述

5、indexOf

看源码
在这里插入图片描述
indexOf方法就是查询元素的位置,如果没有这个元素就返回-1。

6、lastIndexOf

看源码
在这里插入图片描述
lastIndexOf就是返回这个元素最后出现的位置,如果没有这个元素,就返回-1。

四、Vector实现类

Vector底层是用数组实现的List,相关的方法都加了同步检查,因此“线程安全,效率低”。 比如,indexOf方法就增加了synchronized同步标记。
在这里插入图片描述

五、使用建议

  1. 需要线程安全时,用Vector。

  2. 不存在线程安全问题时,并且查找较多用ArrayList(一般使用它)。

  3. 不存在线程安全问题时,增加或删除元素较多用LinkedList。

六、感谢阅读

这是我自学Java基础,在b站看高淇老师的视频后的一些理解,其中有一部分也是引用了老师的东西,如果我的理解有错误希望可以提出,一起进步。

原创文章 8 获赞 12 访问量 1179

猜你喜欢

转载自blog.csdn.net/m0_46394124/article/details/105605259
今日推荐