- List 是元素有序并且可以重复的集合,称为序列
- List 可以精确的控制每个元素的插入位置,或删除某个位置的元素
- List 的两个主要实现类,是 ArrayList 和 LinkedList
ArrayList
- ArrayList 底层是由数组实现的
- 动态增长,以满足应用程序的需求
- 在列表尾部插入或删除非常有效
- 更适合查找和更新元素
- ArrayList 中的元素可以为 NULL
下面的例子介绍 ArrayList 的增删改查
1 | import java.util.ArrayList; |
运行结果:
list的长度为:5
输出list中的第二个元素:b
遍历list数组:
–第一种遍历方法—for循环
a b c d e
–第二种遍历方法—foreach循环(修改第三个位置的数据)
a b z d e
–第三种遍历方法—Iterator迭代器(去掉第二个位置的数据)
a z d e
LinkedList
- 与 ArrayList 一样,LinkedList 也按照索引位置排序,但它的元素之间是双向链表的
- 适合快速地插入和删除元素
- LinkedList 实现 List 和 Queue 两个接口
案例一:使用 LinkedList 对字符串进行管理
1 | import java.util.LinkedList; |
运行结果
[banana, apple, orange, pear, grape]
‘Mast’不存在
位置3的元素是:orange
第一个元素是:banana
最后一个元素是:grape
案例二:使用 LinkedList 对自定义类进行管理
1 | public class Student { |
1 | import java.util.LinkedList; |
运行结果
链表为:[Student{stuNum=3, stuName=’Lucy’, stuAge=19}, Student{stuNum=2, stuName=’Mike’, stuAge=20}, Student{stuNum=1, stuName=’Jack’, stuAge=18}]
弹出的数据为:Student{stuNum=3, stuName=’Lucy’, stuAge=19}
调用 pop() 方法后的链表为:[Student{stuNum=2, stuName=’Mike’, stuAge=20}, Student{stuNum=1, stuName=’Jack’, stuAge=18}]
调用 peek() 方法的数据为:Student{stuNum=2, stuName=’Mike’, stuAge=20}
调用 peek() 方法后的链表为:[Student{stuNum=2, stuName=’Mike’, stuAge=20}, Student{stuNum=1, stuName=’Jack’, stuAge=18}]
弹出的数据为:Student{stuNum=2, stuName=’Mike’, stuAge=20}
调用 pop() 方法后的链表为:[Student{stuNum=1, stuName=’Jack’, stuAge=18}]
重新添加元素后的链表为:[Student{stuNum=3, stuName=’Lucy’, stuAge=19}, Student{stuNum=2, stuName=’Mike’, stuAge=20}, Student{stuNum=1, stuName=’Jack’, stuAge=18}]
调用 poll() 方法的数据为:Student{stuNum=3, stuName=’Lucy’, stuAge=19}
调用 poll() 方法后的链表为:[Student{stuNum=2, stuName=’Mike’, stuAge=20}, Student{stuNum=1, stuName=’Jack’, stuAge=18}]
我们在这里发现,好像 pop() 和 poll() 的作用是一样的。
pop() 和 poll() 的区别
poll是队列数据结构实现类的方法,从队首获取元素,同时获取的这个元素将从原队列删除;
pop是栈结构的实现类的方法,表示返回栈顶的元素,同时该元素从栈中删除,当栈中没有元素时,调用该方法会发生异常
其实,这两个函数的代码实现是基本一致的,如果一定要说区别那么就是当头结点为空的时候,两个函数的处理方式不同:poll()选择返回null,pop()选择抛出异常。
ArrayList 和 LinkedList 的区别
ArrayList 和 LinkedLis t可想从名字分析,它们一个是 Array(动态数组)的数据结构,一个是 Link(链表)的数据结构,此外,它们两个都是对 List 接口的实现。
前者是数组队列,相当于动态数组;后者为双向链表结构,也可当作堆栈、队列、双端队列
当随机访问 List 时( get 和 set 操作),ArrayList 比 LinkedList 的效率更高,因为 LinkedList 是线性的数据存储方式,所以需要移动指针从前往后依次查找。
当对数据进行增加和删除的操作时( add 和 remove 操作),LinkedList 比 ArrayList 的效率更高,因为ArrayList 是数组,所以在其中进行增删操作时,会对操作点之后所有数据的下标索引造成影响,需要进行数据的移动。
从利用效率来看,ArrayList 自由性较低,因为它需要手动的设置固定大小的容量,但是它的使用比较方便,只需要创建,然后添加数据,通过调用下标进行使用;而 LinkedList 自由性较高,能够动态的随数据量的变化而变化,但是它不便于使用。
线程都不安全