从零开始学java(25)--- 一些简单的数据结构与LinkedList

滚雪球学Java(72):从零开始掌握Java Queue:深入浅出学习指南 Queue是计算机科学中一个重要的数据结构,它是一种线性数据结构,用于存储按顺序排列的元素集合。在Java中,Queue是一个接口,它可以用来实现FIFO(先进先出)的队列数据结构。队列是一个常用的数据结构,可以用来实现许多重要的算法和程序。本文将深入浅出地介绍Java Queue的各种知识点和应用场景,包括Queue的定义、源代码解析、应用场景案例、优缺点分析、类代码方法介绍和测试用例。通过本文的学习,读者将能够全面掌握Java Queue的使用方法和实现原理,从而更好地进行Java开发。 阅读详情

Day15

今天了解一些简单的数据结构和学习LinkedList的有关知识。

1.数据结构与算法

什么是数据结构?

Sartaj Sahni在他的《数据结构、算法与应用》一书中称:“数据结构是数据对象,以及存在于该对象的实例合组成实例的数据元素之间的各种联系。这些联系可以通过定义相关的函数来给出。”他将数据对象(data object)定义为“一个数据对象是实例或值的集合”。

Clifford A.Shaffer在《数据结构与算法分析》一书中的定义是:“数据结构是 ADT(抽象数据类型Abstract Data Type) 的物理实现。”

大话数据结构:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。

什么是算法?

算法是解决问题步骤的有限集合,通常用某一种计算机语言进行伪码描述。通常用时间复杂度和空间复杂度来衡量算法的优劣。

算法的五大特征:输入、输出、有穷性、确定性、可行性。
输入:零个或多个输入。
输出:一个或多个输出。
有穷性:有限步骤后在可接受时间内完成。
确定性:每个步骤都有确定含义,无二义性。
可行性:每一步都是可行的。

算法设计要求:正确性、可读性、健壮性、时间效率高和存储低。
正确性:有输入输出,无二义性,有正确答案。
可读性:方便阅读。
健壮性:输入不合法能处理
时间效率高和存储低:时间空间复杂度越低越好。

1.数组

数组是相同数据类型的元素按一定顺序排列的集合,是一块连续的内存空间。
特点:我们都知道数组中的元素在内存中连续存储的,可以根据是下标快速访问元素,因此,查询(get和set)速度很快,时间上都是O(1)的,然而插入和删除(add和remove)时,需要对元素移动空间,比较慢,操作时间上都是O(N)的。

Java中,Array就是数组,此外,ArrayList使用了数组Array作为其实现基础,它和一般的Array相比,最大的好处是,我们在添加元素时不必考虑越界,元素超出数组容量时,它会自动扩张保证容量。

Vector和ArrayList相比,主要差别就在于多了一个线程安全性,但是效率比较低下。如今java.util.concurrent包提供了许多线程安全的集合类(比如 LinkedBlockingQueue),所以不必再使用Vector了。

数组使用场景:频繁查询,很少增加和删除的情况。

2.链表

链表是一种非连续、非顺序的结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,链表由一系列结点组成。
Java中,LinkedList 使用链表作为其基础实现。

特点:元素可以不连续内存中,是以索引将数据联系起来的,当查询(get和set)元素的时候需要从头开始查询,操作时间上都是O(N)的,而且需要额外的空间存储指向其他数据地址的项。,所以效率比较低。然而添加和删除(add和remove)的只需要修改索引就可以了,操作时间上都是O(1)的。

查找操作对于未排序的数组和链表时间上都是O(N)。

使用场景:少查询,需要频繁的插入或删除情况

3.队列

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端进行删除操作,而在表的后端进行插入操作,亦即所谓的先进先出(FIFO)。

特点:先进先出,

Java中,LinkedList实现了Deque,可以做为双向队列(自然也可以用作单向队列)。另外PriorityQueue实现了带优先级的队列,亦即队列的每一个元素都有优先级,且元素按照优先级排序。

使用场景:多线程阻塞队列管理非常有用

4.栈

栈(stack)又名堆栈,它是一种运算受限的线性表。其限制是仅允许在表的一端进行插入和删除运算。这一端被称为栈顶,相对地,把另一端称为栈底。它体现了后进先出(LIFO)的特点。

特点:先进后出。

Java中,Stack实现了这种特性,但是Stack也继承了Vector,所以具有线程安全线和效率低下两个特性,最新的JDK8中,推荐用Deque来实现栈,比如:

使用场景:实现递归以及表示式

5.数组与链表的区别

数组连续,链表不连续(从数据存储形式来说)

数组内存静态分配,链表动态分配

数组查询复杂度0(1),链表查询复杂度O(n)

数组添加或删除,复杂度o(n),链表添加删除,复杂度O(1)

数组从栈中分配内存。链表从堆中分配内存。

6.集合

集合是指具有某种特定性质的具体的或抽象的对象汇总成的集体,这些对象称为该集合的元素,其主要特性是元素不可重复。

在Java中,HashSet体现了这种数据结构,而HashSet是在MashMap的基础上构建的。LinkedHashSet继承了HashSet,使用HashCode确定在集合中的位置,使用链表的方式确定位置,所以有顺序。TreeSet实现了SortedSet 接口,是排好序的集合(在TreeMap 基础之上构建),因此查找操作比普通的Hashset要快(log(N));插入操作要慢(log(N)),因为要维护有序。

2.LinkedList

LinkedList也是List接口的实现类,与ArrayList不同之处是采用的存储结构不同,ArrayList的数据结构为线性表,而LinkedList数据结构是链表。链表数据结构的特点是每个元素分配的空间不必连续、插入和删除元素时速度非常快、但访问元素的速度较慢。

其内部实现是一个双向(不循环)的链表

优点:对数据经常增加或删除,性能优于ArrayList
缺点:检索数据时不如ArrayList

LinkedList类每个结点用内部类Node表示,LinkedList通过first和last引用分别指向链表的第一个和最后一个元素,当链表为空时,first和last都为NULL值。LinkedList数据结构如下图所示:

在这里插入图片描述

1.在LinkedList中添加元素

LinkedList提供了多个添加元素的方法:

●boolean add(E e)

在链表尾部添加一个元素,如果成功,返回true,否则返回false。

●void addFirst(E e)

在链表头部插入一个元素。

●addLast(E e)

在链表尾部添加一个元素。

●void add(int index, E element)

在指定位置插入一个元素。

2.从LinkedList中删除元素

LinkedList提供了多个删除元素的方法:

●boolean remove(Object o)

从当前链表中移除指定的元素。

● E remove(int index)

从当前链表中移除指定位置的元素。

● E removeFirst()

从当前链表中移除第一个元素。

● E removeLast()

从当前链表中移除最后一个元素。

● E remove()

从当前链表中移除第一个元素,同removeLast()相同。

3.从LinkedList中获取元素

LinkedList提供了多个获取元素的方法:

● E get(int index)

从当前链表中获取指定位置的元素。

● E getFirst()

从当前链表中获取第一个元素。

● E getLast()

从当前链表中获取最后一个元素。

4.LinkedList的遍历方法

LinkedList可以通过迭代器、foreach语句、for循环语句等方法遍历集合的所有元素。

foreach语句效率最高,其次是迭代器,效率最差的是for循环。

鸿蒙实战开发教程-注册登录页面 在密码输入框中,只要设置TextInput的类型就可以实现带眼睛logo的密码输入框效果: 阅读详情

相关推荐

优化NEXYS A7开发板(Xilinx Artix-7)Microblaze核的FLASH读写性能实战

本文针对NEXYS A7开发板(Xilinx Artix-7)上Microblaze核读写FLASH速度慢的问题,提供了系统性的优化实战指南。通过深入分析SPI控制器配置、Flash指令模式选择、Microblaze核的Cache与硬件加速器优化,以及程序运行位置(BRAM vs DDR)的调整,有效将FLASH读写性能从“龟速”提升至接近理论峰值。文章结合实测数据,为FPGA嵌入式开发者提供了清晰的性能瓶颈分析与解决方案。

carrot的博客 258

java基础25----LinkedList类

LinkedList和ArrayList类似,但是有一些方法是ArrayList不具备的 与ArrayList采用的存储结构不同,ArrayList的数据结构为线性表,而LinkedList数据结构是链表。链表数据结构的特点是每个元素分配的空间不必连续、插入和删除元素时速度非常快、但访问元素的速度较慢。 import java.util.ArrayList; import java.u...

zkywbt的博客 147

stm32f103c8t6的中文字库

stm32的成熟中文字库,上手即用,操作简单

nbbskk的博客 3653

Java基础五:LinkedList

概述 LinkedList是基于双向链表的非线性安全的一种线性的数据存储结构,由于这一特性,LinkedList还可以用作栈、队列或双端队列,LinkedList中的元素可以为空、可以重复同时又是有序的。 既然是基于双向链表,那么每个元素都存储了指向前一个或者后一个元素的指针域,所以可以通过任意一个元素,通过向前或者向后寻址的方式去查找到前一个元素或者后一个元素。而且,头部和尾部中也通过指针域来...

向日葵班学霸的博客 395

大数据Alluxio面试题及参考答案

Alluxio 在大数据生态里的定位是作为数据编排层,能在不同计算框架和存储系统之间起到桥梁的作用。它的核心功能在于加速数据访问,让大数据应用能够更高效地使用数据。Alluxio 把数据存储和数据处理分离开来,使计算框架可以在不考虑底层存储细节的情况下访问数据,这样就提高了系统的灵活性和可扩展性。Alluxio 和 HDFS 既存在关联又有区别。从关联方面来看,HDFS 是一种广泛使用的分布式文件系统,很多大数据应用都将其作为主要的数据存储系统。Alluxio 可以和 HDFS 集成,把 HDFS 当作底层

大模型大数据攻城狮的专栏 862

无法加载文件:C:\Users\Lenovo\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本编程

当您遇到类似于"无法加载文件:C:\Users\Lenovo\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本编程"的错误消息时,请按照上述步骤来解决问题。当您尝试加载文件C:\Users\Lenovo\AppData\Roaming\npm\cnpm.ps1时,可能会遇到类似于"无法加载文件:C:\Users\Lenovo\AppData\Roaming\npm\cnpm.ps1,因为在此系统上禁止运行脚本编程"的错误消息。请注意,更改执行策略可能会带来一些安全风险。

PixelInk的博客 1922

Java对LinkedList进行排序

链表是一个线性数据结构,其中的元素是不能存储在连续的存储单元。 按升序对单链接列表的节点进行排序: 原始清单 排序清单 我们可以通过许多排序技术对LinkedList进行排序: 气泡排序 插入排序 快速分类 合并排序 方法1:使用冒泡排序进行排序 为了完成此任务,我们维护两个指针:current和index。 最初,当前指向头节点,索引将指向当前旁边的节点。 通过将当前数据与索引数据进行比较,遍历列表直到当前指向null。 对于每个当前值,索引是当前节点的下一个节点,它

allway2的博客 8412

图注意力网络(GAT)原理与代码实战案例讲解

1. 背景介绍 图注意力网络(Graph Attention Network,简称GAT)是一种基于图神经网络(Graph Neural Networks,简称GNN)的深度学习方法。它能够处理具有复杂关系的节点数据,并在多个领域取得了显著的效果,如社交网络分析、推荐系统等。 2. 核心概念与联系

AI架构师小马 2715

从零开始带你学习Java中的数据结构之List和LinkedList

有序集合(也称为序列 )。 该界面的用户可以精确控制列表中每个元素的插入位置。 用户可以通过整数索引(列表中的位置)访问元素,并搜索列表中的元素。 与集合不同,列表通常**允许重复的元素**。 更正式地,列表通常允许元素e1和e2成对使得e1.equals(e2) ,并且如果它们允许空元素,它们通常**允许多个空元素**。 有人可能希望实现一个禁止重复的列表,当用户尝试插入时会抛出运行时异常,但是我们预计这种使用是罕见的。 该List接口放置额外的约定,超过在Collection指定接口上的iterat

匿名王同学的博客 435

基于自适应小波阈值算法的图像去噪

自适应小波阈值算法是一种基于小波变换的方法,它相对于传统的小波阈值去噪方法具有更好的性能和鲁棒性。该算法首先对图像进行小波变换,然后根据小波系数的大小确定一个自适应的阈值,将小波系数与阈值进行比较,大于阈值的系数被保留,小于阈值的系数被置零。在上述代码中,首先选取了小波函数sym4进行小波分解,然后根据标准差计算出阈值,使用wthresh函数进行阈值处理,最后进行反变换得到处理后的图像。该GUI界面与前面的自适应小波阈值算法代码结合,实现了图像的去噪,并提供了可视化的效果。

与其临渊羡鱼,不如退而结网 559

STM32CubeMX之emWin移植

“前面两章介绍了SDRAM和LTDC的使用,本篇文章将介绍emWin移植到STM32。”硬件环境:STM32F429IGT6软件环境:STM32CubeMX v5.5.0...

zhang062061的专栏 2826

JAVA --ArrayList与LinkedList

ArrayList和LinkedList的特点,两个之间的区别。

m0_74993557的博客 1430

主题035:计算流体力学(CFD)

计算流体力学(Computational Fluid Dynamics, CFD)是利用数值方法求解流体流动、传热传质等问题的学科。CFD已成为化学反应工程中反应器设计和优化的重要工具。∂ρ∂t+∇⋅(ρu)=0 \frac{\partial \rho}{\partial t} + \nabla \cdot (\rho \mathbf{u}) = 0 ∂t∂ρ​+∇⋅(ρu)=0对于不可压缩流动:∇⋅u=0 \nabla \cdot \mathbf{u} = 0 ∇⋅u=0动量方程:∂(ρu)∂t+∇⋅(ρ

kkchenjj的博客 267

【Java 数据结构】从零开始学习Java(Day23)ArrayList(动态数组)与LinkedList(双向链表)

一起从零开始成就Java大神

黎明前的黑暗最为深邃,但只要你坚持,曙光终会划破天际。 960

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【新手向】从零开始学习Java(Day22)Java 数据结构

一起从零开始成就Java大神

黎明前的黑暗最为深邃,但只要你坚持,曙光终会划破天际。 1833

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

从零开始学Java系列教程(一):数据结构(LinkedList类)

链式存储结构 1、单链表 节点构成:由两部分组成,其中一部分用于存储节点中的数据(data),另外一部分用于存储指向下一个节点的地址值(next)。 重要特点:只能从一个方向遍历单链表,因此也称之为“单向链表”。 注意事项:单链表的尾结点的next存储的为null 2、双链表 节点构造:由三部分组成,data用于存储节点中的数据,prev用于存储指向上一个节点的地址值,next用于存储指向下一个节点的地址值。 重要特点:既可以...

Thinking帆的博客 245

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java的linkedlist_Java集合之LinkedList

上一篇写的是ArrayList,这一篇写一下LinkedList.开宗明义,因为Vector已经被废弃了,所以list家族只剩下ArrayList和LinkedList两兄弟了,这里直接对比一下二位:ArrayList基于动态数组的实现,它长于随机访问元素,但是在中间插入和移除元素时较慢LinkedList基于链表实现,在List中间进行插入和删除的代价较低,提供了优化的顺序访问。LinkedLi...

weixin_32068473的博客 182

【数据结构与算法】3、java中的LinkedList以及实现自己的链表

双链表每个节点都有一个指向前一个节点点的“指针”和一个指向后一个节点的"指针",这样就把每个节点联系了起来构成了一个双向链表。 一、java中的LinkedList的使用 LinkedList是双向链表,既然它继承于AbstractSequentialList,就相当于已经实现了“get(int index)这些接口”。 链表的使用还是比较简单的,java中的LinkedList提供了诸多操作链...

江南雨敲窗的博客 225

67从零开始学Java之List集合有哪些特性?

在上一篇文章中,壹哥给大家介绍了Java里的集合,我们了解了集合的由来、特点,以及一些接口API等,但这些内容都偏重于理论。那么从今天这篇文章开始,我们会从实战的角度来进行List集合的学习。可以说,List集合是开发时用的最多的一种集合,尤其是ArrayList更是被经常使用。所以对今天的内容,壹哥希望大家要好好阅读和练习。前戏已做完,精彩即开始全文大约【5800】字,不说废话,只讲可以让你学到技术、明白原理的纯干货!

一一哥 1560

Java用链表实现LinkedList

1.要实现的功能 1. 可以任意添加任意类型的数据 void add(Object obj) 2. 可以记录当前数据的个数 int size() 3. 可以打印当前数据结构的对象 toString(),格式如下:[值1,值2.。。。。] 4. 查询指定下标的元素 Object searchByIndex(int index) 5. 查询指定的元素第一次出现的位置 int searchBy...

qq_34407846的博客 398

从零开始学JAVA——集合(一)

集合(一)一、集合框架的概述二、集合框架三、 Colletion接口声明的方法的测试四、集合元素遍历操作,使用迭代器Iterator接口JDK5.0新增了foreach循环,用于遍历集合和数组 一、集合框架的概述 1.集合、数组都是对多个数据进行存储操作的结构,简称JAVA容器。 说明:此时的存储,主要指的时内存层面的存储,不涉及到持久化的存储(.txt.jpg.avi) 2.1数组在存储多个数据方面的特点: 1)一旦初始化以后,其长度就确定了。 2)数组一旦定义好,其元素的类型也就确定了。我们也只能操作指

man的博客 236

从零开始JAVA数据结构学习笔记(二)

import java.util.LinkedList; public class Demo02 { public static void main(String[] args) { LinkedList<Number> list = new LinkedList<Number>();//定义链表list LinkedList<Number> lis...

weixin_44439085的博客 189

JAVA(手写)简单实现ArrayList和LinkedList

JAVA(手写)简单实现ArrayList和LinkedList 大家都知道在java学习中list类的实现类中有ArrayList 和LinkedList,其中ArrayList是使用数组实现,而LinkedList则是用链表实现的。今天就自己去用java去简单实现一下它们。 1.ArrayList的实现 1.类必须的属性 一个object的数组 list的长度 2.基本代码 `public c...

Simlier的博客 987

《JAVA源码分析》:LinkedList

LinkedList源码分析今天就来看下LinkedList的源码,先看下LinkedList的继承体系结构。public class LinkedList<E> extends AbstractSequentialList<E> implements List<E>, Deque<E>, Cloneable, java.io.Serializable LinkedList实现了List、Deque

wojiushimogui的博客 1159

【java】手撕LinkedList

【java】手撕LinkedList

qq_57420582的博客 448

【从零开始学Java66】讲解Java集合中的Collection体系

截止到今天,我们《从零开始学Java系列》的文章已经要到一个新的阶段了。在此之前,我们学习了Java里的各种基础知识,包括环境配置、基本语法、分支循环、数组、常用类等。而从今天开始,本系列文章要给大家介绍另一个我们开发时特别常用的知识点–集合!其实我们之前学习的数组也是集合的一种,但数组的结构比较简单,并且自身也存在一些天生的缺陷,比如数组的长度是不可修改的。然而在很多情况下,我们在开发时并不能直接确定数据的数量,这就导致我们在开发时不能频繁地使用数组。

关注我!带你一路 "狂飙" 到底! 2591
上一篇: 从零开始学java(24)---集合框架 ,ArrayList
下一篇: 从零开始学java(26)--- 集合框架
Muyaaa
博客等级 码龄9年 18粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值