赞
踩
List是有序、可重复的容器。
有序:List中每个元素都是有索引标记。可以根据元素的索引标记访问元素,从而精确控制这些元素。
可重复:List运行加入重复的元素。更确切的讲,List通常允许满足e1.equals(e2)的元素重复加入容器。
之前Collection接口中的方法在List中都能用,还有一些List特有的跟索引有关的方法:
同时,List接口常用的实现类有3个,接下来我们一个个介绍。
ArrayList底层是用数组实现的,我们可以理解为ArrayList是一个比较智能的数组,它会自动设数组长度,当长度不够用时会自动扩大数组长度。
特点:查询效率高,增删效率低,线程不安全。
我们先看一下源码:
我们看到,如果new一个实现类为ArrayList的容器对象时,传入的长度参数是多少,这个容器的长度就为多少,如果没有传入长度参数,那么这个容器的长度就为10。
先看源码
我们看到add方法有两种,一种只用传一个参数,一种要传两种。
第一种:只传一个参数,参数就是需要存入这个容器的值,看源码我们知道,这种方法就是简单的传入的参数放到数组的最后一个元素的后面。
第二种:传两个参数,index是传入参数存储的位置,element是传入的参数的值,简单来讲就是将这个element插入index这个位置。
看源码
set方法就是将index位置的元素替换成element。
看源码
get方法就是返回index这个位置存储的元素。
看源码
我们发现也有两种,第一种是传入需要移除的元素的位置,
第二种是传入需要移除的元素的值。
第一种:直接找到这个位置,然后把后面的元素往前移一个位置,原先的最后一个元素的位置变为空,这时我们传入的位置的元素就被覆盖了,也就被移除了。
第二种:一个一个去对比,如果发现这个值,就以上面说的这个方法把它移除,但是这只能移除第一次出现的这个元素。如果传入的这个值为空,那么就查找元素之间插入的一个为空的位置,用后面的元素将这个位置填掉。
看源码
indexOf返回就是查找传入的这个值对应的第一次出现的位置,如果没有差到就返回-1。
看源码
lastIndexOf方法查询的时候是从最后一个元素开始查的,也就是说他是返回这个元素最后一次出现的位置。
LinkedList底层是用双向非循环链表实现的存储。
特点:查询效率低,增删效率高,线程不安全。
我们先来看看双向非循环链表是什么样的
它的每个数据节点都有两个指针,分别指向前一个节点和后一个节点。
看源码
add方法有四种种,boolean add(),addFirst(),addLast(),void add()。
boolean add():在链表的最后加一个元素,并返回true。
addFirst():在链表的第一个元素前面加一个元素。
addLast():在链表的最后加一个元素。
void add():在链表的固定位置插入一个元素。
插入的过程是这样的
看源码
set方法就是将固定位置的元素替换为传入的元素
看源码
get方法有三种,get(),getFirst(),getLast()。
get():返回指定位置的元素。
getFirst():返回第一个元素。
getLast():返回最后一个元素。
看源码
同样三种,remove(),removeFirst(),removeLast()。
remove():移除指定位置的元素。
removeFirst():移除第一个元素。
removeLast():移除最后一个元素。
删除过程
看源码
indexOf方法就是查询元素的位置,如果没有这个元素就返回-1。
看源码
lastIndexOf就是返回这个元素最后出现的位置,如果没有这个元素,就返回-1。
Vector底层是用数组实现的List,相关的方法都加了同步检查,因此“线程安全,效率低”。 比如,indexOf方法就增加了synchronized同步标记。
需要线程安全时,用Vector。
不存在线程安全问题时,并且查找较多用ArrayList(一般使用它)。
不存在线程安全问题时,增加或删除元素较多用LinkedList。
这是我自学Java基础,在b站看高淇老师的视频后的一些理解,其中有一部分也是引用了老师的东西,如果我的理解有错误希望可以提出,一起进步。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。