百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

框架之LinkedList(代码演示)(linkedlist addfirst)

toyiye 2024-07-08 00:36 18 浏览 0 评论

LinkedList简介

LinkedList是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。

LinkedList实现List接口,能对它进行队列操作。

LinkedList实现Deque接口,即能将LinkedList当作双端队列使用。

LinkedList实现了Cloneable接口,即覆盖了函数clone(),能克隆。

LinkedList实现java.io.Serializable接口,这意味着LinkedList支持序列化,能通过序列化去传输。

LinkedList是非同步的。

AbstractSequentialList实现了get(int index)、set(int index, E element)、add(int index, E element) 和 remove(int index)这些函数。这些接口都是随机访问List,LinkedList是双向链表;既然它继承于AbstractSequentialList,就相当于已经实现了“get(int index)这些接口”。

LinkedListCollection关系如下图:

LinkedList的本质是双向链表。

(01) LinkedList继承于AbstractSequentialList,并且实现了Dequeue接口。

(02) LinkedList包含两个重要的成员:header和size。

  header是双向链表的表头,它是双向链表节点所对应的类Entry的实例。Entry中包含成员变量: previous, next, element。其中,previous是该节点的上一个节点,next是该节点的下一个节点,element是该节点所包含的值。

  size是双向链表中节点的个数。

总结

(01) LinkedList实际上是通过双向链表去实现的。

它包含一个非常重要的内部类:Entry。Entry是双向链表节点所对应的数据结构,它包括的属性有:当前节点所包含的值上一个节点下一个节点

(02) 从LinkedList的实现方式中可以发现,它不存在LinkedList容量不足的问题。

(03) LinkedList的克隆函数,即是将全部元素克隆到一个新的LinkedList对象中。

(04) LinkedList实现java.io.Serializable。当写入到输出流时,先写入“容量”,再依次写入“每一个节点保护的值”;当读出输入流时,先读取“容量”,再依次读取“每一个元素”。

(05) 由于LinkedList实现了Deque,而Deque接口定义了在双端队列两端访问元素的方法。提供插入、移除和检查元素的方法。每种方法都存在两种形式:一种形式在操作失败时抛出异常,另一种形式返回一个特殊值(null 或 false,具体取决于操作)。

LinkedList遍历方式

LinkedList支持多种遍历方式。建议不要采用随机访问的方式去遍历LinkedList,而采用逐个遍历的方式。

(01) 第一种,通过迭代器遍历。即通过Iterator去遍历。

for(Iterator iter = list.iterator(); iter.hasNext();)

iter.next();

(02) 通过快速随机访问遍历LinkedList

int size = list.size();

for (int i=0; i<size; i++) {

list.get(i);

}

(03) 通过另外一种for循环来遍历LinkedList

for (Integer integ:list)

;

(04) 通过pollFirst()来遍历LinkedList

while(list.pollFirst() != null)

;

(05) 通过pollLast()来遍历LinkedList

while(list.pollLast() != null)

;

(06) 通过removeFirst()来遍历LinkedList

try {

while(list.removeFirst() != null)

;

} catch (NoSuchElementException e) {

}

(07) 通过removeLast()来遍历LinkedList

try {

while(list.removeLast() != null)

;

} catch (NoSuchElementException e) {

}

测试其中遍历方式效率的代码如下

package lxh.demo.listdemotest;

import java.util.Iterator;

import java.util.LinkedList;

/**

* 测试LinkedList的几种遍历方式和效率

* @author Ray

*

*/

public class LinkedListThruTest {

public static void main(String[] args) {

LinkedList list = new LinkedList();

for(int i = 0; i < 50000; i++) {

list.add(i);

}

iteratorLinkedListThruIterator(list);

iteratorLinkedListThruForeach(list);

iteratorThroughFor2(list);

}

/*

* 通过Iterator遍历LinkedList

*/

private static void iteratorLinkedListThruIterator(LinkedList list) {

//记录开始时间

long startTime = System.currentTimeMillis();

for(Iterator iter = list.iterator(); iter.hasNext();) {

iter.next();

}

long endTime = System.currentTimeMillis();

System.out.println("iteratorLinkedListThruIterator: " + (endTime-startTime) + "ms");

}

/*

* 通过快速随机访问遍历LinkedList

*/

private static void iteratorLinkedListThruForeach(LinkedList list) {

//记录开始时间

long startTime = System.currentTimeMillis();

for(int i = 0; i < list.size(); i++) {

list.get(i);

}

//记录结束时间

long endTime = System.currentTimeMillis();

System.out.println("iteratorLinkedListThruForeach: " + (endTime-startTime) + "ms");

}

/*

* 通过另一种for循环来遍历LinkedList

*/

private static void iteratorThroughFor2(LinkedList list) {

//记录开始时间

long startTime = System.currentTimeMillis();

for(Object integ:list) {

;

}

//记录结束时间

long endTime = System.currentTimeMillis();

System.out.println("iteratorThroughFor2: " + (endTime-startTime) + "ms");

}

}

测试结果:

iteratorLinkedListThruIterator: 3ms

iteratorLinkedListThruForeach: 953ms

iteratorThroughFor2: 1ms

总结:无论如何,千万不要通过随机访问去遍历LinkedList

LinkedList示例

下面通过一个示例来学习如何使用LinkedList的常用API

package lxh.demo.listdemotest;

import java.util.LinkedList;

/**

* LinkedList测试程序

* @author 沐兮沐楚

*

*/

public class LinkedListTest01 {

public static void main(String[] args) {

testLinkedListAPIs();

}

/*

* 测试LinkedList中部分API

*/

private static void testLinkedListAPIs() {

String val = null;

//新建一个LinkedList

LinkedList llist = new LinkedList();

//依次添加元素

llist.add("1");

llist.add("2");

llist.add("3");

//将"4"添加到第一个位置

llist.add(0, "4");

System.out.println("element: " + llist);

System.out.println("\nTest \"addFirst(),removeFirst(),getFirst()\"");

//1.将10添加到第一个位置

llist.addFirst("10");

System.out.println("llist: " + llist);

//2.将第一个元素删除

System.out.println("llist.removeFirst(): " + llist.removeFirst());

System.out.println("llist: " + llist);

//3.获取第一个元素

System.out.println("llist.getFirst(): " + llist.getFirst());

System.out.println("\nTest \"offerFirst(), pollFirst(), peekFirst()\"");

//1.将10添加到第一个位置,返回true

llist.offerFirst("10");

System.out.println("llist: " + llist);

//2.将第一个元素删除,失败返回null

System.out.println("llist.pollFirst(): " + llist.pollFirst());

System.out.println("llist: " + llist);

//3.获取最后一个元素

System.out.println("llist.getLast(): " + llist.getLast());

//将第三个元素设置300. 不建议在LinkedList中使用此操作,效率低

llist.set(2, "300");

//获取第三个元素. 不建议在LinkedList中使用此操作,因为效率低

System.out.println("\nget(2): " + llist.get(2));

//将LinkedList转换为数组

String[] arr = (String[]) llist.toArray(new String[0]);

for(String str : arr) {

System.out.println("str: " + str);

}

}

}

测试结果:

element: [4, 1, 2, 3]

Test "addFirst(),removeFirst(),getFirst()"

llist: [10, 4, 1, 2, 3]

llist.removeFirst(): 10

llist: [4, 1, 2, 3]

llist.getFirst(): 4

Test "offerFirst(), pollFirst(), peekFirst()"

llist: [10, 4, 1, 2, 3]

llist.pollFirst(): 10

llist: [4, 1, 2, 3]

llist.getLast(): 3

get(2): 300

str: 4

str: 1

str: 300

str: 3

总结起来如下表格:

第一个元素(头部) 最后一个元素(尾部)

抛出异常 特殊值 抛出异常 特殊值

插入 addFirst(e) offerFirst(e) addLast(e) offerLast(e)

移除 removeFirst() pollFirst() removeLast() pollLast()

检查 getFirst() peekFirst() getLast() peekLast()

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码