参考的博客

Java 集合系列05之 LinkedList详细介绍(源码解析)和使用示例

如果你想详细的区了解容器知识以及本文讲的LinkedList,我推荐你去看这篇博客和这个做个的容器系列

LinkedList

public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, java.io.Serializable

LinkedList是基于双向链表的,它继承了AbstractSequentialList类,实现了List等接口,它与ArrayList最大的区别就是他们基于的数据结构是不一样的,ArrayList是数组。因此当你随机访问(通过get(i这种操作),LinkedList效率是很低的,它的get方法本质一次次遍历index,不停的自加找到位置,所以非常慢。我测试了遍历,可以看下常用的三种遍历方式的耗时

LinkedList作为队列

队列的特点就是先进先出。

我下面的例子实际上用了add方法添加元素,add方法调用的是addLast方法,这样后加的元素就在最后啦,遍历的又调用pee方法,peek方法如下

    public E peek() {
final Node<E> f = first;
return (f == null) ? null : f.item;
}

每次读的就是第一个,这样就先进先出了_

LinkedList作为栈

栈的特点就是后进先出

我下面的例子,在存的是用的push方法,push调用是addFirst,因此最后加的就成为第一元素了。

遍历的时候调用element,它的实现是getFirst方法

    public E element() {
return getFirst();
}

最后进的放在第一位,然后你再去get第一位,模拟出栈的操作。

代码测试

package com.fang.java.javabase.firstcollection;

import java.util.Iterator;
import java.util.LinkedList; import lombok.extern.slf4j.Slf4j; @Slf4j
/*
LinkedList的API
boolean add(E object)
void add(int location, E object)
boolean addAll(Collection<? extends E> collection)
boolean addAll(int location, Collection<? extends E> collection)
void addFirst(E object)
void addLast(E object)
void clear()
Object clone()
boolean contains(Object object)
Iterator<E> descendingIterator()
E element()
E get(int location)
E getFirst()
E getLast()
int indexOf(Object object)
int lastIndexOf(Object object)
ListIterator<E> listIterator(int location)
boolean offer(E o)
boolean offerFirst(E e)
boolean offerLast(E e)
E peek()
E peekFirst()
E peekLast()
E poll()
E pollFirst()
E pollLast()
E pop()
void push(E e)
E remove()
E remove(int location)
boolean remove(Object object)
E removeFirst()
boolean removeFirstOccurrence(Object o)
E removeLast()
boolean removeLastOccurrence(Object o)
E set(int location, E object)
int size()
<T> T[] toArray(T[] contents)
Object[] toArray() */
public class LinkedListTest{
public static void main(String[] args) {
//测试遍历
iteratorLinkedlist(getList());
forLinkedlist(getList());
forEachLinkedlist(getList()); //测试API
testLinkedListPartAPIs();
//测试栈
useLinkedListAsLIFO();
//测试队列
useLinkedListAsFIFO();
}
private static LinkedList getList(){
LinkedList list=new LinkedList<>();
for(int i=0 ;i<50000;i++){
list.add(i);
}
return list;
} //itetator
private static void iteratorLinkedlist(LinkedList<Integer> list){
long start=System.currentTimeMillis();
Iterator it=list.iterator();
while(it.hasNext()){
it.next();
}
long end=System.currentTimeMillis();
log.info("iterator Linkedlist: "+(end-start)+"ms");
}
//for
private static void forLinkedlist(LinkedList<Integer> list){
long start=System.currentTimeMillis();
for(int i=0;i<list.size();i++){
list.get(i);
}
long end=System.currentTimeMillis();
log.info("for Linkedlist: "+(end-start)+"ms");
}
//foreach
private static void forEachLinkedlist(LinkedList<Integer> list){
long start=System.currentTimeMillis();
for(Integer i:list){ }
long end=System.currentTimeMillis();
log.info("forEach Linkedlist: "+(end-start)+"ms");
}
private static void testLinkedListPartAPIs(){
LinkedList <String>list =new LinkedList<String>();
log.info("test API");
list.add("10");
list.add("20");
list.add("30");
//add first
list.addFirst("first");
//get first
log.info("Test get First {}",list.getFirst());
//add last
list.addLast("last");
//get last
log.info("Test get Last {}", list.getLast());
}
/*
模拟
将LinkedList当作 LIFO(后进先出)的堆栈
*/
private static void useLinkedListAsLIFO(){
LinkedList<String> stack=new LinkedList<>();
//push(E e) 将元素推入此列表所表示的堆栈。是靠着addFirst(e)实现;
stack.push("1");
stack.push("2");
stack.push("3");
stack.push("4");
log.info("test LinkedList"); log.info(stack.toString());//[4, 3, 2, 1]
//peek() 获取但不移除此列表的头(第一个元素)。遍历第一个
//pop() 从此列表所表示的堆栈处弹出一个元素。removeFirst
log.info(stack.pop());
log.info(stack.peek());
} /*
将LinkedList当作 FIFO(先进先出)的队列
*/
private static void useLinkedListAsFIFO() {
LinkedList<String> queue=new LinkedList<>();
queue.add("1");
queue.add("2");
queue.add("3");
queue.add("4");
log.info("test LinkedList queue");
log.info(queue.toString());
//remove() 获取并移除此列表的头(第一个元素
log.info(queue.remove());
//element()获取但不移除此列表的头(第一个元素)。
log.info(queue.element());
}
}

测试结果

2019-07-05 11:38:46,958   [main] INFO  com.fang.java.javabase.firstcollection.LinkedListTest  - iterator Linkedlist: 5ms
2019-07-05 11:38:48,322 [main] INFO com.fang.java.javabase.firstcollection.LinkedListTest - for Linkedlist: 1359ms
2019-07-05 11:38:48,330 [main] INFO com.fang.java.javabase.firstcollection.LinkedListTest - forEach Linkedlist: 3ms
2019-07-05 11:38:48,330 [main] INFO com.fang.java.javabase.firstcollection.LinkedListTest - test API
2019-07-05 11:38:48,335 [main] INFO com.fang.java.javabase.firstcollection.LinkedListTest - Test get First first
2019-07-05 11:38:48,335 [main] INFO com.fang.java.javabase.firstcollection.LinkedListTest - Test get Last last
2019-07-05 11:38:48,336 [main] INFO com.fang.java.javabase.firstcollection.LinkedListTest - test LinkedList stack
2019-07-05 11:38:48,336 [main] INFO com.fang.java.javabase.firstcollection.LinkedListTest - [4, 3, 2, 1]
2019-07-05 11:38:48,336 [main] INFO com.fang.java.javabase.firstcollection.LinkedListTest - 4
2019-07-05 11:38:48,337 [main] INFO com.fang.java.javabase.firstcollection.LinkedListTest - 3
2019-07-05 11:38:48,337 [main] INFO com.fang.java.javabase.firstcollection.LinkedListTest - test LinkedList queue
2019-07-05 11:38:48,337 [main] INFO com.fang.java.javabase.firstcollection.LinkedListTest - [1, 2, 3, 4]
2019-07-05 11:38:48,337 [main] INFO com.fang.java.javabase.firstcollection.LinkedListTest - 1
2019-07-05 11:38:48,337 [main] INFO com.fang.java.javabase.firstcollection.LinkedListTest - 2

LinkedList学习:API调用、栈、队列实现的更多相关文章

  1. 反射实现Model修改前后的内容对比 【API调用】腾讯云短信 Windows操作系统下Redis服务安装图文详解 Redis入门学习

    反射实现Model修改前后的内容对比   在开发过程中,我们会遇到这样一个问题,编辑了一个对象之后,我们想要把这个对象修改了哪些内容保存下来,以便将来查看和追责. 首先我们要创建一个User类 1 p ...

  2. JS理论:调用栈、事件循环、消息队列(也叫任务队和回调队列)、作业队列(微任务队列)

    一:调用栈是个什么鬼东西,它具有栈的属性--后进先出 先看一段简单的JS代码: const second = function(){ console.log('hello there'); } con ...

  3. JAVA微服务应用(1)--SpringBoot中的REST API调用(学习笔记)

    好长时间没有写学习小结了,最近宁正好看了小马哥的微服务系列之<Spring Boot>系列,颇有收获,并且公司也布置一个课题就是关于Spring中的REST API调用.于是乎回归本行,再 ...

  4. Java web与web gis学习笔记(二)——百度地图API调用

    系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...

  5. java 集合 Connection 栈 队列 及一些常用

    集合家族图 ---|Collection: 单列集合 ---|List: 有存储顺序 , 可重复 ---|ArrayList: 数组实现 , 查找快 , 增删慢 ---|LinkedList: 链表实 ...

  6. Java 容器之 Connection栈队列及一些常用

    集合家族图 ---|Collection: 单列集合 ---|List: 有存储顺序 , 可重复 ---|ArrayList: 数组实现 , 查找快 , 增删慢 ---|LinkedList: 链表实 ...

  7. 详解JavaScript调用栈、尾递归和手动优化

    调用栈(Call Stack) 调用栈(Call Stack)是一个基本的计算机概念,这里引入一个概念:栈帧. 栈帧是指为一个函数调用单独分配的那部分栈空间. 当运行的程序从当前函数调用另外一个函数时 ...

  8. JavaScript是如何工作的:引擎,运行时间以及调用栈的概述

    JavaScript是如何工作的:引擎,运行时以及调用栈的概述 原文:How JavaScript works: an overview of the engine, the runtime, and ...

  9. LinkedList 的 API 与数据结构

    LinkedList 是 List 接口和 Deque 接口的双向链表实现,它所有的 API 调用都是基于对双向链表的操作.本文将介绍 LinkedList 的数据结构和分析 API 中的算法. 数据 ...

随机推荐

  1. php之新的开始---php的相关及其环境搭建

    写在前面:首先,感谢“奇矩”给的这次机会,不论结果如何,我都会尽我最大的努力! 在今晚之前,如果说,我与php的接触是停留在知道的阶段,那今晚过后,我想我算是认识了php.php作为一门编程语言,已经 ...

  2. Python:re 模块

    re模块是python内置的正则表达式模块

  3. python 切片技巧

    说明: 字符串[开始索引:结束索引:步长] 开始索引:从指定位置开始截取: 结束索引:从指定位置结束截取,但不包含该位置的字符. 步长:不指定时步长为1: 1)当步长为正数时候,那么切片是从左到右进行 ...

  4. 线程同步 - POSIX互斥锁

    线程同步 - POSIX互斥锁 概括 本文讲解POSIX中互斥量的基本用法,从而能达到简单的线程同步.互斥量是一种特殊的变量,它有两种状态:锁定以及解锁.如果互斥量是锁定的,就有一个特定的线程持有或者 ...

  5. 确定BP神经网络中的节点数

    输入层 输入层节点数=输入向量维数 MNIST例子中,单张MNIST图片大小为28*28,reshape为一维数组,长度为784,所以输入层节点数为784: network = Network([78 ...

  6. 监控Tomcat状态!(重点)

    方法一:开发JAVA监控页面 [root@localhost ~]# mkdir /usr/local/tomcat8/webapps/memtest/[root@localhost ~]# cd / ...

  7. Centos610安装Firefox

    yum -y install firefox yum install fonts-chinese yum install fonts-ISO8859-2-75dpi 修改 /etc/sysconfig ...

  8. 标签UILabel的讲解

    首先,我先自定义几个名词,方便接下来的讲解工作.如下图所示: 接下来,通过五个方面来讲解我们能对UILabel做出哪些改变或者称之为设置: 1.文字 1.1普通文字:内容text.字体大小font.字 ...

  9. 【剑指Offer面试编程题】题目1506:求1+2+3+...+n--九度OJ

    题目描述: 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字及条件判断语句(A?B:C). 输入: 输入可能包含多个测试样例. 对于每个 ...

  10. Java基础 -4.4

    For循环 for循环也是一种常规的使用结构 public static void main(String[] args) { for(定义循环的初始值;循环判断;修改循环条件) { 循环语句的执行; ...