参考的博客

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. ASP.NET Core搭建多层网站架构【7-使用NLog日志记录器】

    2020/01/29, ASP.NET Core 3.1, VS2019, NLog.Web.AspNetCore 4.9.0 摘要:基于ASP.NET Core 3.1 WebApi搭建后端多层网站 ...

  2. 「CF241E」Flights

    传送门 Luogu 解题思路 首先对于所有不属于任何一条路径上的边,它的权值是任意的. 对于所有在路径上的边 \((u,v)\) 满足 \(1\le dis_v-dis_u\le2\) 差分约束即可. ...

  3. Java JDBC 数据库链接小结随笔

    Java JDBC 数据库链接小结随笔 一.链接数据库的步骤 二.关于Statement  和  PrepareStatement 两者区别 用法 三.关于 ResultSet 的一些小结 四.自定义 ...

  4. Java 多线程学习笔记(一)

    一.进程和线程 (1)进程概念的引入 为了能使程序并发执行,并且可以对并发执行的程序加以描述和控制,人们引入了“进程”的概念.---摘之计算机操作系统(第四版)汤小丹编著 (2)进程概念 进程(Pro ...

  5. 使用$.ajax时的注意事项

    做PHP难免接触js,我也是这样,使用ajax的时候,我比较习惯使用$.ajax({}),这种方式,因为通用性较强.有时候会较少使用js,隔一段时间后再使用,有些细节内容容易模糊不清,这一次,我又忘记 ...

  6. pip配置永久国内源

    1.windows配置方式: (1)打开文件资源管理器 --------在地址栏中输入 %appdata% (2)手动创建一个文件夹叫做 pip (3)在pip的文件夹里面新建一个文件 pip.ini ...

  7. JQuery DOM操作:设置内容&属性&添加元素&插入元素&包裹&克隆&移除&替换

    JQuery text().html().val() $(elem).text(str):添加文本内容str到elem类型元素,返回jQuery对象 $(elem).text():返回第一个elem标 ...

  8. wx小程序笔记

    目录 p18 事件绑定1 p19 事件绑定2 btn p20+ view 相关,wxss,less,css 零基础玩转微信小程序[黑马程序员] https://www.bilibili.com/vid ...

  9. 【JS 常用操作】全选、给后来元素增加事件

    11 //全选 $("#allCheckbox").click(function () { var checkedStatus = this.checked; //alert(ch ...

  10. linux 管道相关命令(待学)

    1.1 cut cut:以某种方式按照文件的行进行分割 参数列表: -b 按字节选取 忽略多字节字符边界,除非也指定了 -n 标志 -c 按字符选取 -d 自定义分隔符,默认为制表符. -f 与-d一 ...