参考的博客

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. Linux中限制用户邮件的大小

    Linux系统使用sendmail发送邮件,配置文件是/etc/sendmail.cf,缺省使用TCP/IP协议. 我们的Linux机器上往往会有多个用户同时工作,或者干脆就用它作邮件服务器,在同一时 ...

  2. ANSYS-APDL施加扭转载荷CERIG命令

    目录 1. 要求 2. ANSYS有限元分析 2.1 APDL建模 2.2 APDL施加载荷 2.3 APDL查看结果 3. 举一反三 1. 要求 一块0.8m*0.4m*0.04m厚的钢板,在板的两 ...

  3. Java中几种office文档转pdf的方式

    最近公司要做office的文档,搜集了几种office文档转pdf的方式,简单的做下总结 我主要尝试了三种方式:openoffice,aspose,jacob 对他们进行了大文件,小文件,在linux ...

  4. 关于编译QT官方的MQTT库.

    先放一位博主的资料,参阅了其中资料,表示感谢: https://www.cnblogs.com/yexiaopeng/p/8542894.html ########################## ...

  5. kafka start bat

    start D:\Homes\kafka_2.12-2.3.0\bin\windows\kafka-server-start.bat D:\Homes\kafka_2.12-2.3.0\config\ ...

  6. 解决idea创建maven项目无java

    在idea上创建maven-archetype-webapp项目后发现无法创建java文件然后参考此博客得以解决 https://www.cnblogs.com/mywangpingan/p/9448 ...

  7. selenium webdriver 常用方法

    /** * 判断元素是否存在 * * @param driver * @param by * @return */ public static boolean isElementPresent(Web ...

  8. java 8时间使用LocalDateTime,ZonedDateTime,LocalDate

    前言 java 8的时间已经能够满足日常的使用,也方便理解.joda-time作为一个有优秀的时间组件也不得不告知使用者在java 8以后使用自带的时间 LocalDateTime以及ZonedDat ...

  9. System.arraycopy方法解释

    数组拷贝 public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int lengt ...

  10. SpringMvc 视图解析器常见功能、类型转换、格式化

    springmvc.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns=" ...