集合简单入门(二)
上一篇复习到ArrayList,下面是LinkedList
LinkedList
回顾LinkedList之前先看一下链表数据结构
需求一:查询33这个节点应该怎么办?
只能从头开始查,直到查到33这个节点为止
需求二:在33这个节点后添加一个节点55应该怎么办?
首先找到33这个节点,然后将55节点的地址值对原先44的地址值进行覆盖(上图红色的线),然后把44这个节点的地址值保存在55这个节点中
需求三:删除33这个节点怎么办?
首先找到33这个节点,然后把44这个节点的地址值添加到22这个节点中,覆盖33这个节点的地址值
LinkedList集合特点:
1、它的底层使用的链表结构;
2、有头有尾,其中的方法都是围绕头和尾设计的;
3、LinkedList集合可以根据头尾进行各种操作,但它的增删效率高,查询效率低;
LinkedList集合增删效率高是因为底层是链表结构,如果增加或者删除只需要在增加或者删除节点的位置上记住新的节点的地址即可,而其他节点不需要移动,所以速度会快。
而查询遍历由于链表结构的特点,查询只能从头一直遍历到链表的结尾,所以速度会慢。
4、LinkedList集合底层也是线程不安全。效率高;
5、也可以存储null元素;
LinkedList特有的方法:
由于LinkedList是链表结构,而链表有头有尾,所以在LinkedList集合中专门为链表结构提供了特有的函数。这些方法我们作为了解即可:
-
public void addFirst(E e)
:将指定元素插入此列表的开头。 -
public void addLast(E e)
:将指定元素添加到此列表的结尾。 -
public E getFirst()
:返回此列表的第一个元素。 -
public E getLast()
:返回此列表的最后一个元素。 -
public E removeFirst()
:移除并返回此列表的第一个元素。 -
public E removeLast()
:移除并返回此列表的最后一个元素。 -
public E pop()
:删除并返回此列表的第一个元素。此方法相当于removeFirst()
。 -
public boolean isEmpty()
:如果列表不包含元素,则返回true。
LinkedList是List的子类,List中的方法LinkedList都是可以使用,我们只需要了解LinkedList的特有方法即可。在开发时,LinkedList集合也可以作为堆栈,队列的结构使用。(了解即可)
方法演示:
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList<String> link = new LinkedList<String>();
//添加元素
link.addFirst("abc1");
link.addFirst("abc2");
link.addFirst("abc3");
System.out.println(link);
// 获取元素
System.out.println(link.getFirst());
System.out.println(link.getLast());
// 删除元素
System.out.println(link.removeFirst());
System.out.println(link.removeLast());
while (!link.isEmpty()) //判断集合是否为空
{
System.out.println(link.pop()); //弹出集合中的栈顶元素
}
System.out.println(link);
}
}
堆栈数据结构和队列数据结构
/* 队列数据结构 类似于排队买票,先进先出 * */ public class Queue<E> { //创建队列 private LinkedList<E> list = new LinkedList<E>(); //模拟排队买票 public void addElement(E element){ list.add(element); } //模拟买完票就退出队列 public E getElement(){ return list.removeFirst(); } //模拟查看是否有人买票 public boolean isNull(){ return list.isEmpty(); } }
public class QueueTest { public static void main(String[] args) { Queue<String> queue = new Queue<>(); //排队买票 queue.addElement("1号"); queue.addElement("2号"); queue.addElement("3号"); while (!queue.isNull()) {//查看是否有人买票 //然后排队买票 System.out.println(queue.getElement()+"买完票了,推出了队列"); } } }
/* 堆栈数据结构 类似于弹夹,先进后出 * */ public class Queue<E> { //创建队列 private LinkedList<E> list = new LinkedList<E>(); //模拟添加子弹 public void addElement(E element){ list.add(element); } //模拟打子弹 public E getElement(){ return list.removeLast(); } //模拟查看是否有子弹 public boolean isNull(){ return list.isEmpty(); } }
public class QueueTest { public static void main(String[] args) { Queue<String> queue = new Queue<>(); //添加子弹 queue.addElement("1号弹"); queue.addElement("2号弹"); queue.addElement("3号弹"); while (!queue.isNull()) {//查看是否有子弹 //然后打子弹 System.out.println(queue.getElement()+"被打出去了"); } } }
总结:ArrayList与LinkedList的区别
1.ArrayList的底层是数组数据结构,LinkedList的底层是链表数据结构
2.ArrayList相对于LinkedList来说查询快,增删慢
3.LinkedList相对于ArrayList来说查询慢,增删快