结构体中vector自动为0_面试题:你是如何选择顺序存储数据结构的?

作者:Tarun Telang 来源:https://dzone.com/articles/arraylist-or-linkedlist

本文为Java开发人员选择适当的顺序数据结构提供指导。

ArrayList 和 LinkedList 是 Java 集合框架中用来存储对象引用列表的两个类。ArrayList 和 LinkedList 都实现 List 接口。首先,让我们了解一下它们最重要的父接口——List。

# 1、List 接口

列表(list)是元素的有序集合,也称为序列。它提供了基于元素位置的操作,有助于快速访问、添加和删除列表中特定索引位置的元素。List 接口实现了 Collection 和 Iterable 作为父接口。它允许存储重复值和空值,支持通过索引访问元素。

# 2、具体用法

下面是使用 List 接口声明 ArrayList 和 LinkedList 的代码片段。

238c81cc72ec8f3293d41cf5bcc78bc3.png

Vector 与 ArrayList 类似,只是 Vector 支持自动同步,这也使得 Vector 线程安全,但同时会带来一些性能损耗。

# 3、内部实现

LinkedList 内部实现

Linkedlist 数据结构包含一组有序的数据元素,称为节点。每个元素都包含对其后续元素,即下一个元素的链接或引用。 序列的最后一个元素(尾部)指向空元素。链表本身包含对链表第一个元素的引用,该元素称为 head 元素。Java 中的 LinkedList 是 List 接口的双向链表。在双向链表中,每个节点都指向它的上一个节点和下一个节点。此外,它还实现了其他接口,比如 Serializable、 Cloneable 和 Deque(实现 Queue 作为父接口)。

ArrayList 内部实现

ArrayList 是可调整大小的数组,实现了 List 接口。 它的内部是一个对象数组,可以根据需要扩容支持在集合中加入更多元素。可以通过构造函数 ArrayList(int initialCapacity)指定 ArrayList 的初始容量,然后在必要时使用 void ensureCapacity(int minCapacity) 增加容量,确保至少可以容纳初始化时最小容量参数指定数量的元素。

它还提供一个方法 void trimToSize(),可以减少现有元素的大小。

// 调用构造函数 ArrayList(initialCapacity)List arr = new ArrayList(10);

默认情况下,ArrayList 创建初始容量为10的列表,而 LinkedList 只构造一个没有设置任何初始容量的空列表。 Linkedlist 不实现 RandomAccess 接口,而 ArrayList 实现了 RandomAccess 接口(而非 Deque 接口)。

# 4、各种操作的时空复杂性

9424d92244ae0ac6aaa85a3019c80cbc.png

# 5、提示

考虑下面遍历 LinkedList 的示例代码。在这段代码中遍历会非常慢,因为 LinkedList 不支持随机访问,因此每次遍历都会带来巨大的开销。

LinkedList ll = new LinkedList();……Object o = null;for (int i = 0; i < list.size(); i++){ o = list.get(i); …}

一个更好的方法可提高性能,像下面这段代码。

LinkedList ll = new LinkedList();……Object o = null;ListIterator li = list.listIterator(0);while (li.hasNext()){ o = ll.next(); …}

# 6、总结

相比较而言 ArrayList 更快而且更好,因为它支持对其元素的随机访问。 遍历链表或在中间插入新元素开销很大,因为必须遍历每个元素而且很可能遇到缓存失败。 如果需要在一次迭代中对列表中的多个项目执行处理,那么 LinkedList 的开销比 ArrayList 使用时多次复制数组元素的开销要小。

欢迎分享你对这个话题的经验与见解,请在文章的评论区中提出你的想法。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/551628.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数字填图问题matlab上机实验报告,数学建模实验报告数字填图问题

数字填图问题一、实验目的及意义本实验旨在通过生活中几个常见的数字填图问题的探究&#xff0c;探究这类问题的逻辑推理解法和计算机解法&#xff0e;二、实验内容1. 数字填图的逻辑推理&#xff1b;2. 数字填图的计算机解法。三、实验步骤1.开启软件平台——MA TLAB&#xff…

c++ 函数指针_进化论——从函数指针到被结构封装的函数指针及参数的应用举例...

↑↑↑ 点击上方公众号名称关注&#xff0c;不放过任何转变的机会。✎ 编 者 悟 语借口再小也会瓦解人的意志。文 章 导 读今天带大家用下函数指针&#xff0c;然后将函数指针和函数参数封装到结构体中&#xff0c;接着将数据用动态分配和静态分配的方式赋值给相应的函数&#…

python怎么做软件界面_python – 如何自定义桌面应用程序的标题栏和窗口

我如何自定义标题栏(包括&#xff1a;关闭,最大化,最小化按钮,标题)和用PyQt编写的桌面应用程序框架,使其看起来像下面的图像&#xff1f;我需要一种方法来指定我想用于标题栏元素的颜色(按钮,文本标题和条形和按钮的背景颜色).我需要更改其窗口的代码&#xff1a; import sys …

python绘制社会关系网络图_Python networkx 网络图绘制

简单演示import networkx as nx import matplotlib.pyplot as plt # 定义空图 g nx.Graph() # 增加节点 g.add_node(1) g.add_node(A) g.add_nodes_from([2, 3]) g.add_edge(2, 3) g.add_edges_from([(1, 2), (1, 3)]) nx.draw(g, with_labelsTrue) plt.show() 一次增加多个点…

查看LINUX放开端口,linux如何查看端口是否开放?

在linux中我们可以通过在命令行中使用lsof命令、netstat命令来检查端口是否开放。方法一&#xff1a;使用lsof命令我们可以使用lsof命令来检查某一端口是否开放&#xff0c;基本语法如下&#xff1a;lsof -i:端口号如果没有任何输出则说明没有开启该端口号下图以80端口和53端口…

python数据处理框架_python 最快 web 框架 Sanci 快速入门

简介 Sanic 是一个和类Flask 的基于Python3.5的web框架&#xff0c;它编写的代码速度特别快。 除了像Flask 以外&#xff0c;Sanic 还支持以异步请求的方式处理请求。这意味着你可以使用新的 async/await 语法&#xff0c;编写非阻塞的快速的代码。 关于 asyncio 包的介绍&…

linux tcp ip c,Linux下TCP/IP编程--TCP实战(select)

本文参考自徐晓鑫《后台开发》&#xff0c;记录之。一、为什么要使用非阻塞I/O之select初学socket的人可能不爱用select写程序&#xff0c;而习惯诸如connect、accept、recv/recvfrom这样的阻塞程序。当让服务器同时为多个客户端提供一问一答服务时&#xff0c;很多程序员采用多…

单片机8×8点阵显示简单汉字的程序_干货 | 浅析单片机制作贪吃蛇游戏

为了让大家更深入地了解底层的原理&#xff0c;在讲解时特意选择了51单片机(而非STM系列)&#xff0c;另外16*16点阵由译码器和移位缓存器直接驱动(而非MAX系列芯片)&#xff0c;摇杆也利用ADC功能判断方向。那如何让单片机驱动这256个点呢&#xff1f;直接用IO口驱动显然不够且…

怎样在linux中创建硬盘,在linux中添加新硬盘并创建LVM组

1、以虚拟机为例&#xff0c;给虚拟机添加一块新硬盘&#xff0c;并创建LVM组&#xff0c;将新硬盘用于存放oracle数据库文件。2、fdisk -ll查看新添加的硬盘是否被识别&#xff0c;如图已经识别出sdb。3、# pvcreate /dev/sdb (创建PV&#xff0c;相当于win中将基础磁盘转换…

双代号网络图基础算法_软考网络工程师之系统开发和运行基础(软件分类、测试、模型)...

系统开发和运行基础(软件的分类、软件生存周期、软件开发模型、软件测试、软件项目管理)软件的分类系统软件&#xff0c;如操作系统。支撑软件&#xff0c;如开发工具。应用软件&#xff0c;如office。实时处理软件&#xff0c;一般是工业软件。软件生存周期1、软件定义问题定义…

在学Python前学Linux,Python原来这么好学-1.2节: 在Linux中安装python

这里将告诉您Python原来这么好学-1.2节: 在Linux中安装python,具体操作过程:在Linux系统的主要发行版中&#xff0c;按其软件包格式来进行划分&#xff0c;可分为Deb系以及RPM系操作系统。Linux系统与Windows系统有一个很重要的区别&#xff0c;Linux系统完全免费&#xff0c;开…

python金融大数据分析视频_Python金融大数据分析 PDF 全书超清版

给大家带来的一篇关于Python相关的电子书资源&#xff0c;介绍了关于Python金融、大数据分析方面的内容&#xff0c;本书是由人民邮电出版社出版&#xff0c;格式为PDF&#xff0c;资源大小47.8 MB&#xff0c;希尔皮斯科编写&#xff0c;目前豆瓣、亚马逊、当当、京东等电子书…

kaggle房价预测特征意思_机器学习-kaggle泰坦尼克生存预测(一)-数据清洗与特征构建...

1、背景&#xff1a;1.1 关于kaggle&#xff1a;谷歌旗下的 Kaggle 是一个数据建模和数据分析竞赛平台。该平台是当下最流行的数据科研赛事平台&#xff0c;其组织的赛事受到全球数据科学爱好者追捧。 如果学生能够在该平台的一些比赛中获得较好的名次&#xff0c;不仅可以赢得…

linux docker安装svn,使用docker镜像搭建svn+Apache环境

环境准备虚拟机装好之后&#xff0c;按照官网步骤检查虚拟机内核版本&#xff0c;必须在3.10以上版本&#xff0c;故此处安装redhat_7.2# uname -r3.10.0-327.el7.x86_64安装docker&#xff1a;yum install docker-io有依赖是直接安装具体的依赖软件&#xff0c;解决依赖docker…

springboot 设置ico_Spring Boot--Thymeleaf模板引擎/静态页面

点关注&#xff0c;不迷路&#xff1b;持续更新Java相关技术及资讯&#xff01;&#xff01;&#xff01;1.Spring Boot对静态资源的映射规则如果静态资源文件夹下有 index.html的话,直接访问localhost:8080的话,index就是欢迎页使用自己的图标:在静态资源文件夹放一个 favicon…

linux shell 豆瓣,用Linux shell脚本爬取豆瓣邮箱

前两天总结一下邮箱格式的正则表达式&#xff0c;写了一个脚本来判断输入的邮箱地址是否符合邮箱的格式(有兴趣的朋友可以翻一下我的博客去看一下)。在网上找资料的时候&#xff0c;发现基本都是用Python和Java来做爬虫&#xff0c;当然Python的居多。本着学习的心态&#xff0…

php 获取header_php 输出404状态码

今天在做一个php数据提交的小功能时&#xff0c;需要在判断一个值是如果为空时&#xff0c;就让后台的逻辑页面返回 404 状态码&#xff0c;提示用户页面不存在。那么接下来&#xff0c;飞鸟慕鱼博客要说的是 php 如何返回或输出 html 404 的状态码。php header()函数header()&…

getcwd和pwd为什么不一样_农村医保,为什么每个地区收费不一样?

新农村合作医疗保险的缴费标准&#xff0c;为什么每个地区都不一样呢&#xff1f;我们可能不难发现&#xff0c;就是说你在的地区每年交费可能是280元&#xff0c;但是别的人在的地区可能交费达到了306元或者说320元&#xff0c;这究竟是一种什么样的情况呢&#xff1f;其实每个…

矩阵论思维导图_《实变函数论》 江泽坚 3rd 思维导图与笔记整理

实变函数学十遍实变函数应该是你们本科所有数学课程中最难的了 ————韦老师如是说学期初就知道这个课不好学。话不多说&#xff0c;期末之前把复习导图全部做完了&#xff0c;po上来分享。注&#xff1a;由于制作辛苦&#xff0c;所以预先告知收取些许费用&#xff08;不到一…

jackson 读取多文件_Spring Boot系列之读取配置

使用SpringBoot框架开发&#xff0c;读取配置是少不了的&#xff0c;那么你会读取配置吗&#xff1f;你会写配置吗&#xff1f;List&#xff1f;Map&#xff1f;1 目的本节我们要解决如下几个问题&#xff1a;如何使用Spring Boot读取配置文件&#xff1f;有哪些方式&#xff1…