LinkedList学习:API调用、栈、队列实现
参考的博客
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调用、栈、队列实现的更多相关文章
- 反射实现Model修改前后的内容对比 【API调用】腾讯云短信 Windows操作系统下Redis服务安装图文详解 Redis入门学习
反射实现Model修改前后的内容对比 在开发过程中,我们会遇到这样一个问题,编辑了一个对象之后,我们想要把这个对象修改了哪些内容保存下来,以便将来查看和追责. 首先我们要创建一个User类 1 p ...
- JS理论:调用栈、事件循环、消息队列(也叫任务队和回调队列)、作业队列(微任务队列)
一:调用栈是个什么鬼东西,它具有栈的属性--后进先出 先看一段简单的JS代码: const second = function(){ console.log('hello there'); } con ...
- JAVA微服务应用(1)--SpringBoot中的REST API调用(学习笔记)
好长时间没有写学习小结了,最近宁正好看了小马哥的微服务系列之<Spring Boot>系列,颇有收获,并且公司也布置一个课题就是关于Spring中的REST API调用.于是乎回归本行,再 ...
- Java web与web gis学习笔记(二)——百度地图API调用
系列链接: Java web与web gis学习笔记(一)--Tomcat环境搭建 Java web与web gis学习笔记(二)--百度地图API调用 JavaWeb和WebGIS学习笔记(三)-- ...
- java 集合 Connection 栈 队列 及一些常用
集合家族图 ---|Collection: 单列集合 ---|List: 有存储顺序 , 可重复 ---|ArrayList: 数组实现 , 查找快 , 增删慢 ---|LinkedList: 链表实 ...
- Java 容器之 Connection栈队列及一些常用
集合家族图 ---|Collection: 单列集合 ---|List: 有存储顺序 , 可重复 ---|ArrayList: 数组实现 , 查找快 , 增删慢 ---|LinkedList: 链表实 ...
- 详解JavaScript调用栈、尾递归和手动优化
调用栈(Call Stack) 调用栈(Call Stack)是一个基本的计算机概念,这里引入一个概念:栈帧. 栈帧是指为一个函数调用单独分配的那部分栈空间. 当运行的程序从当前函数调用另外一个函数时 ...
- JavaScript是如何工作的:引擎,运行时间以及调用栈的概述
JavaScript是如何工作的:引擎,运行时以及调用栈的概述 原文:How JavaScript works: an overview of the engine, the runtime, and ...
- LinkedList 的 API 与数据结构
LinkedList 是 List 接口和 Deque 接口的双向链表实现,它所有的 API 调用都是基于对双向链表的操作.本文将介绍 LinkedList 的数据结构和分析 API 中的算法. 数据 ...
随机推荐
- jQuery之绑定焦点事件(焦点事件失效)
在使用jQuery绑定事件时,若某个事件不存在,则该事件后 绑定的事件均失效: 如图所示,若失去焦点事件checkEmail不存在, 会导致后面的事件checkMobile,和事件checkBirth ...
- socket实现简单的FTP
一.开发环境 server端:centos 7 python-3.6.2 客户端:Windows 7 python-3.6.2 pycharm-2018 程序目的:1.学习使用socketserve ...
- AOP的基本认识
一.AOP的概念 AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善. ...
- DHCP原理及报文格式
DHCP原理及报文格式 DHCP(Dynamic Host Configuration Protocol,动态主机配置协议)是IETF为实现IP的自动配置而设计的协议,它可以为客户机自动分配IP地址. ...
- 杭电 2013 猴子吃桃 递归解法&循环解法
题目估计看到过3次不止了,所以还是想复习下递归的运用. 奉上递归代码: #include <iostream> #include<math.h> #include <io ...
- UI UED设计
Element: https://element.eleme.cn/#/zh-CN/guide/design
- 【PAT甲级】1065 A+B and C (64bit) (20 分)(大数溢出)
题意: 输入三个整数A,B,C(long long范围内),输出是否A+B>C. trick: 测试点2包括溢出的数据,判断一下是否溢出即可. AAAAAccepted code: #defin ...
- DoublyLinkedList(双向链表)
本来还不会写双向链表的,但最近学习了二叉树后,突然意识到这不就是双向链表嘛,然后通过对二叉树的理解,实现了一下双向链表. 代码: #define SIZE 10 DouLL * head, *n, * ...
- MySQL 远程连接问题 (Linux Server)
Mysql Workbench 连接Ubuntu上的Mysql时报如下错误: 原因:查看 /etc/mysql/mysql.conf.d/mysqld.cnf # # Instead of skip ...
- unique() 函数详解
简介 顾名思义,unique,独一无二的.这个函数可以对容器中的元素进行"去重". 但是需要注意,这里的"去重",并没有把重复的元素删除,只是不重复的元素放到了 ...