当前位置: 首页 > news >正文

【ArrayList是如何扩容(ArrayList、LinkedList、与Vector的区别)】

ArrayList、LinkedList、与Vector的区别

  • 解读
    • ArrayList 是一个可改变大小的数组
    • LinkedList 是一个双向链表
    • Vector 属强同步类
  • 拓展知识面
    • ArrayList是如何扩容?
    • 如何利用List实现LRU?

解读

List主要有ArrayList、LinkedList与Vector几种实现。这三者都实现了List接口,使用方式也极其相似,主要区别在于因为实现方式的不同,所以对不同的操作就有不同的效率。

ArrayList 是一个可改变大小的数组

当,更多的元素加入到ArrayList中时,其大小将会动态的增长,内部的元素可以直接通过get与set方法进行访问,因为ArrayList本质上就是数组。

LinkedList 是一个双向链表

在添加和删除元素的时间具有比ArrayList更好的性能,但是在get与set方面是弱于ArrayList。当然了,这些对比都是指数据量很大或者操作很频繁的情况下的对比,如果数据量和运算量很小,那么就没有对比的意义。

Vector 属强同步类

Vector和ArrayList类似,但它属于强同步类。如果你的程序本身是线程安全的(thread-safe,没有在多个线程之间共享同一个集合或者对象),那么使用ArrayList是更好的选择。
Vector和ArrayList在更多元素添加进来时会请求更大的空间。Vector每次请求是它自身大小的双倍空间,而ArrayList每次对size增长50%。
而LinkedList还实现了Queue个Deque接口,该接口与List相比,其提供了更多的方法,包括offer()、peek()、poll()等。

注意:默认情况下ArrayList的初始容量非常小,所以如果可以预估数据量的话,分配一个较大的初始值才属于最佳操作,这样可以减少调整大小的开销。

拓展知识面

ArrayList是如何扩容?

首先,我们要明白ArrayList是基于数组的,这个上面讲到了,我们都知道,申请数组的时间,只能申请一个定长的数组,那么List是如何实现数组扩容的呢???ArrayList的扩容有几个步骤:

  1. 检查新增元素后是否会超过数组的容量,若超过,则进行下一步扩容;
  2. 设置新增容量为原始(旧/老)容量的1.5倍,最多不超过2^31-1(在Java8中ArrayList的容量最大是Integer.MAX_VALUE-8,这是由于在Java8中,ArrayList内部实现进行了一些改进,使用了一些数组复制的技巧来提高性能和内存的利用率,而这些技巧需要额外的8个元素的空间来进行优化)。
  3. 之后呢,申请一个容量为1.5倍的数组,将原有数组的元素复制到新数组中,自此,扩容完成。

如何利用List实现LRU?

LRU,即最近最少使用策略,基于时空局部性原理(最近访问的,未来也会被访问的),往往作为缓存淘汰的策略,如Redis和GuavaMap都使用了这种套胎策略。

我们可以基于LinkedList来实现LRU,因为LinkedList基于双向链表,每个节点都会记录上一个和下一个的节点,具体实现方式如下:

public class LruListCache<E> {private final int maxSize;private final LinkedList<E> list = new LinkedList<>();public LruListCache (int maxSize) {this.maxSize = maxSize;} public void add(E e) {if(list.size() < maxSize) {list.addFrist(e);}else{list.removeLast(); list.addFrist(e);}}public E get(int index) {E e = list.get(index);list.remove(e);add(e);return e;}@Overridepublic String toString() {return list.toString();}}

OK,如果不懂数组和链表的区别的话,随后我有一个专门的数据结构的专栏,会讲到栈和队列、数组和链表以及二叉树的遍历等等内容。会做详细解说。

相关文章:

【ArrayList是如何扩容(ArrayList、LinkedList、与Vector的区别)】

ArrayList、LinkedList、与Vector的区别 解读ArrayList 是一个可改变大小的数组LinkedList 是一个双向链表Vector 属强同步类 拓展知识面ArrayList是如何扩容&#xff1f;如何利用List实现LRU&#xff1f; 解读 List主要有ArrayList、LinkedList与Vector几种实现。这三者都实现…...

STM32_3(GPIO)

GPIO简介 GPIO&#xff08;General Purpose Input Output&#xff09;通用输入输出口8种输入输出模式输出模式可控制端口输出高电平&#xff0c;驱动LED、蜂鸣器、模拟通信协议输出时许等输入模式可读取端口的高低电平或电压&#xff0c;用于读取按键输入、外接模块电平信号输…...

【技巧】PDF文件如何编辑?

日常办公中我们经常会用到PDF文件&#xff0c;PDF具备很好的兼容性、稳定性及安全性&#xff0c;但却不容易编辑&#xff0c;那PDF要如何编辑呢&#xff1f; 如果打开PDF文件就只是只读的性质&#xff0c;说明文件是在线打开&#xff0c;或者通过PDF阅读器打开的&#xff0c;这…...

AR道具特效制作工具

AR&#xff08;增强现实&#xff09;技术已经逐渐渗透到各个行业&#xff0c;为企业带来了全新的营销方式和用户体验。在这个背景下&#xff0c;美摄科技凭借其强大的技术实力和创新精神&#xff0c;推出了一款专为企业打造的美摄AR特效制作工具&#xff0c;旨在帮助企业轻松实…...

鸿蒙4.0开发笔记之DevEco Studio页面操作router的pushUrl页面跳转与back返回上一页(五)

一、认识组件 关于HarmonyOS中ArkTS的基础组件请参见文章鸿蒙4.0开发笔记之ArkTs语言基础与基本组件结构&#xff08;四&#xff09; 二、实现页面跳转pushUrl 1、操作说明 实现页面跳转的核心便是router.pushUrl的调用&#xff0c;操作起来也很简单&#xff0c;总共就四步…...

20个CSS函数-释放设计创造力和响应能力

20个CSS函数-释放设计创造力和响应能力 CSS是网页设计的核心&#xff0c;使开发者和设计者能够制作出令人叹为观止和反应迅速的网页布局。CSS函数通过引入动态性和多功能性提升了我们的设计能力。在本文中&#xff0c;我们将开始讲解20个CSS函数。 1.rgba()&#xff1a;定义颜…...

Dubbo从入门到上天系列第十八篇:Dubbo引入注册中心简介以及DubboAdmin简要介绍,为后续详解Dubbo各种注册中心做铺垫!

一&#xff1a;Dubbo注册中心引言 1&#xff1a;什么是Dubbo的注册中心&#xff1f; Dubbo注册中心是Dubbo服务治理中极其重要的一个概念。它主要是用于对Rpc集群应用实例进行管理。 对于我们的Dubbo服务来讲&#xff0c;至少有两部分构成&#xff0c;一部分是Provider一部分是…...

CentOS8安装MySQL

选择MySQL数据库的原因&#xff1a; 1、运行速度快&#xff1b; 2、开源免费&#xff1b; 3、易学易用&#xff1b; 4、可移植性&#xff0c;能够在众多不同的系统上工作&#xff1b; 5、丰富的接口&#xff0c;提供了用于C、C等语言的API&#xff1b; 6、支持查询语言&#xf…...

Java集合拓展01

1、List&#xff0c;Set&#xff0c;Map三者的区别 List&#xff1a;一个有序&#xff08;元素存入集合的顺序和取出的顺序一致&#xff09;容器&#xff0c;元素可以重复&#xff0c;可以插入多个null元素&#xff0c;元素都有索引。常用的实现类有 ArrayList、LinkedList 和…...

【Django使用】md文档10大模块第5期:Django数据库增删改查和Django视图

Django的主要目的是简便、快速的开发数据库驱动的网站。它强调代码复用&#xff0c;多个组件可以很方便的以"插件"形式服务于整个框架&#xff0c;Django有许多功能强大的第三方插件&#xff0c;你甚至可以很方便的开发出自己的工具包。这使得Django具有很强的可扩展…...

在AWS VPC中运行Nagios检查时指定自定义DNS解析器的选项

在AWS VPC中运行Nagios检查&#xff0c;并希望能够指定自定义DNS解析器来处理请求。我想使用Python requests库来实现这个目标。 根据问题描述&#xff0c;您想在AWS VPC中运行Nagios检查&#xff0c;并希望使用Python的requests库来指定自定义DNS解析器。 要解决这个问题&…...

【uniapp】触底加载事件 onReachBottom 不生效

我遇到的情况有&#xff1a; 检查 css 是不是写了overflow-y: scroll; 或 overflow: auto; 是不是用了局部滚动 <scroll-view></scroll-view>&#xff1b; 注意&#xff1a; onReachBottom 和 scroll-view 是冲突的...

Vue3简单使用(一) --- 环境搭建

node版本管理工具nvm&#xff0c;nvm list、nvm use 14.18.0 可以简单启动服务器&#xff1a;npx serve 安装包&#xff1a;npm install xx1 xx2&#xff0c;npm install -D xx3 xx4 vue提供了多个版本 传统项目引入 全局构建版本 <div id"app"><button …...

陪玩圈子系统APP小程序H5,详细介绍,源码交付,支持二开!

陪玩圈子系统&#xff0c;页面展示&#xff0c;源码交付&#xff0c;支持二开&#xff01; 陪玩后端下载地址&#xff1a;电竞开黑陪玩系统小程序&#xff0c;APP&#xff0c;H5: 本系统是集齐开黑&#xff0c;陪玩&#xff0c;陪聊于一体的专业APP&#xff0c;小程序&#xff…...

目标检测原理

一、什么是目标检测 目标检测的任务是找出图像中所有感兴趣的目标&#xff08;物体&#xff09;&#xff0c;确定他们的类别和位置&#xff0c;是计算机视觉领域的核心问题之一。由于各类物体有不同的外观、形状、姿态&#xff0c;再加上光照、遮挡等因素的干扰&#xff0c;目…...

2、数仓理论概述与相关概念

1、问&#xff1a;数据仓库 建设过程中 经常会遇到那些问题&#xff1f; 模型(逻辑)重复建设 数据不一致性 维度不一致&#xff1a;命名、维度属性值、维度定义 指标不一致&#xff1a;命名、计算口径 数据不规范(字段命名、表名、分层、主题命名规范) 2、OneData数据建设核心方…...

YOLOv5 分类模型 OpenCV和PyTorch两者实现预处理的差异

YOLOv5 分类模型 OpenCV和PyTorch两者实现预处理的差异 flyfish PyTorch封装了PIL库 简单对比下两者的使用方法 import cv2 from PIL import Image import numpy as npfull_path_file_name"/media/a//ILSVRC2012_val_00001244.JPEG"#OpenCV读取图像默认是BGR顺序 …...

使用NPOI处理EXCEL文件:例1-关于优化的一些问题

记得有一次处理Excel文件对比&#xff0c;自己前后使用VBA和NPOI对比了下效率。由于涉及到页面的渲染和刷新&#xff0c;二者的处理速度差了个数量级&#xff08;10多秒和几十分钟的差别&#xff09;。当然使用NPOI操作时也做了一定优化。印象这么深刻这次一有需求就想到了NPOI…...

连接k8s和凌鲨

通过连接k8s和凌鲨&#xff0c;可以让研发过程中的重用操作更加方便。 更新容器镜像调整部署规模查看日志运行命令 架构 所有操作通过k8s proxy连接&#xff0c;通过设置namespace label赋予访问权限。只有赋予特定label的namespace才能被访问。 使用步骤 部署k8s proxy 你…...

C语言——结构体的应用

归纳编程学习的感悟&#xff0c; 记录奋斗路上的点滴&#xff0c; 希望能帮到一样刻苦的你&#xff01; 如有不足欢迎指正&#xff01; 共同学习交流&#xff01; &#x1f30e;欢迎各位→点赞 &#x1f44d; 收藏⭐ 留言​&#x1f4dd; 路还在继续&#xff0c;梦还在期…...

基于AI智能体的加密市场叙事分析与趋势追踪系统构建

1. 项目概述&#xff1a;一个能自主思考的加密市场情报员 最近在SURGE OpenClaw的黑客松里&#xff0c;我和团队捣鼓出了一个挺有意思的东西&#xff0c;我们叫它 MoltTrend Claw 。简单来说&#xff0c;它是一个能自己“看”市场、自己“想”问题、自己“写”报告的加密市…...

别再只调sklearn了!用Statsmodels给你的线性回归模型做个‘体检报告’(附Python代码)

别再只调sklearn了&#xff01;用Statsmodels给你的线性回归模型做个‘体检报告’&#xff08;附Python代码&#xff09; 当你用sklearn的LinearRegression().fit()快速得到一个预测模型后&#xff0c;是否曾好奇过&#xff1a;这个模型真的可靠吗&#xff1f;就像体检报告能揭…...

TypeChain增量生成机制:如何高效管理大型项目的类型定义

TypeChain增量生成机制&#xff1a;如何高效管理大型项目的类型定义 【免费下载链接】TypeChain &#x1f50c; TypeScript bindings for Ethereum smart contracts 项目地址: https://gitcode.com/gh_mirrors/ty/TypeChain TypeChain是一个为以太坊智能合约生成TypeScr…...

企业如何利用多模型聚合平台构建内部智能问答助手

企业如何利用多模型聚合平台构建内部智能问答助手 1. 企业内部智能问答的需求背景 现代企业知识库通常包含产品文档、技术手册、客户案例等结构化与非结构化内容。传统关键词检索难以理解自然语言查询意图&#xff0c;而单一模型在应对不同复杂度问题时可能面临效果或成本瓶颈…...

Magicoder代码大模型:OSS-Instruct数据合成与本地部署实战

1. 项目概述&#xff1a;当代码生成遇上“开源魔法” 如果你最近在关注代码大模型&#xff08;Code LLM&#xff09;的进展&#xff0c;大概率已经听说过 Magicoder 这个名字。这个由伊利诺伊大学厄巴纳-香槟分校&#xff08;UIUC&#xff09;团队开源的项目&#xff0c;在 Hu…...

别再只学动态ARP了!华为交换机静态ARP的3个高级应用场景与配置细节

华为交换机静态ARP的三大高阶实战技巧&#xff1a;从安全加固到流量管控 在现网运维中&#xff0c;大多数工程师对静态ARP的认知仍停留在"防ARP欺骗"的基础层面。实际上&#xff0c;当我们将静态ARP与特定业务场景深度结合时&#xff0c;它能展现出远超基础防护的精细…...

别再当‘接包侠’!从一篇课文教你用Python+Excel做好软件外包项目成本核算

从零构建项目成本模型&#xff1a;PythonExcel规避外包财务陷阱 当技术能力遇上商业盲区 去年接手一个电商小程序开发时&#xff0c;甲方给出的8万元预算让我眼前一亮——按照工时计算&#xff0c;这相当于我三个月工资。但当我真正开始记录各项支出时&#xff0c;才发现调试服…...

使用 curl 命令直接测试 Taotoken 提供的各种大模型效果

使用 curl 命令直接测试 Taotoken 提供的各种大模型效果 1. 准备工作 在开始使用 curl 测试 Taotoken 提供的大模型之前&#xff0c;需要确保已经完成以下准备工作。首先登录 Taotoken 控制台&#xff0c;在「API 密钥」页面创建一个新的 API Key。建议为测试用途单独创建一个…...

别再手动写循环了!用C++14的std::index_sequence优雅遍历tuple和array(附完整代码)

用C14的std::index_sequence实现零开销的编译期遍历 在C模板元编程中&#xff0c;处理std::tuple和std::array这类编译期已知大小的容器时&#xff0c;开发者常常面临一个困境&#xff1a;要么编写冗长的运行时循环代码&#xff0c;要么陷入复杂的递归模板展开。这两种方式要么…...

别再踩坑了!SpringMVC和SpringBoot中@Transactional生效范围的保姆级排查指南

Spring事务失效全场景诊断手册&#xff1a;从原理到实战的深度避坑指南 在Java企业级开发中&#xff0c;事务管理就像空气一样无处不在却又容易被忽视。直到某天你发现账户余额莫名少了几个零&#xff0c;或是订单状态永远卡在"处理中"&#xff0c;才会惊觉事务配置的…...