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

数据结构之数组

写在前面

看下数组。

1:巴拉巴拉

数组是一种线性数据结构,使用连续的内存空间来存储数据,存储的数据要求有相同的数据类型,并且每个元素占用的内存空间相同。获取元素速度非常快,为O(1)常量时间复杂度,所以数组在我们工作直接或者是间接的用到还是比较多的。

2:代码

定义接口:

package com.dahuyou.datastructure.arraylist;public interface List<E> {/*** Appends the specified element to the end of this list (optional* operation).* <p>* 追加元素到尾部!*/boolean add(E e);/*** Removes the element at the specified position in this list (optional* operation).  Shifts any subsequent elements to the left (subtracts one* from their indices).  Returns the element that was removed from the* list.** 删除指定位置的元素**/E remove(int index);/*** Returns the element at the specified position in this list.** 返回指定位置的元素*/E get(int index);}

实现类,这里不贴所有代码了,只看下重要的方法。

  • add
@Override
public boolean add(E e) {// 确保内部容量int minCapacity = size + 1;if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {minCapacity = Math.max(DEFAULT_CAPACITY, minCapacity);}// 判断扩容操作,即将满时扩容,扩容为原来的1.5倍,直接通过oldCapacity + (oldCapacity >> 1)移位操作完成,效率高if (minCapacity - elementData.length > 0) {int oldCapacity = elementData.length;int newCapacity = oldCapacity + (oldCapacity >> 1);if (newCapacity - minCapacity < 0) {newCapacity = minCapacity;}elementData = Arrays.copyOf(elementData, newCapacity);}// 添加元素elementData[size++] = e;return true;
}

这里在两种情况下会进行扩容,第一次插入元素时扩容到10,之后元素满时扩容到原来的1.5倍,这里使用了移位运算,效率更高。

  • remove
@Override
public E remove(int index) {E oldValue = (E) elementData[index];int numMoved = size - index - 1;if (numMoved > 0) {// 从原始数组的某个位置,拷贝到目标对象的某个位置开始后n个元素System.arraycopy(elementData, index + 1, elementData, index, numMoved);}elementData[--size] = null; // clear to let GC do its workreturn oldValue;
}

注意这里删除元素并不是通过一个一个的交换元素来实现的,而是直接通过native方法java.lang.System#arraycopy:

public static native void arraycopy(Object src,  int  srcPos,Object dest, int destPos,int length);

因为是底层直接操作内存,所以效率更高。
测试:

package com.dahuyou.datastructure.arraylist;public class TT {public static void main(String[] args) {List<String> list = new ArrayList<>();list.add("01");list.add("02");list.add("03");list.add("04");list.add("05");list.add("06");list.add("07");list.add("08");list.add("09");list.add("10");list.add("11");list.add("12");System.out.println(list);list.remove(9);System.out.println(list);}}

运行:

ArrayList{elementData=[01, 02, 03, 04, 05, 06, 07, 08, 09, 10, 11, 12, null, null, null], size=12}
ArrayList{elementData=[01, 02, 03, 04, 05, 06, 07, 08, 09, 11, 12, null, null, null, null], size=11}Process finished with exit code 0

写在后面

参考文章列表

相关文章:

数据结构之数组

写在前面 看下数组。 1&#xff1a;巴拉巴拉 数组是一种线性数据结构&#xff0c;使用连续的内存空间来存储数据&#xff0c;存储的数据要求有相同的数据类型&#xff0c;并且每个元素占用的内存空间相同。获取元素速度非常快&#xff0c;为O(1)常量时间复杂度&#xff0c;所…...

springboot集成sensitive-word实现敏感词过滤

文章目录 敏感词过滤方案一&#xff1a;正则表达式方案二&#xff1a;基于DFA算法的敏感词过滤工具框架-sensitive-wordspringboot集成sensitive-word步骤一&#xff1a;引入pom步骤二&#xff1a;自定义配置步骤三&#xff1a;自定义敏感词白名单步骤四&#xff1a;核心方法测…...

C++ 之动手写 Reactor 服务器模型(一):网络编程基础复习总结

基础 IP 地址可以在网络环境中唯一标识一台主机。 端口号可以在主机中唯一标识一个进程。 所以在网络环境中唯一标识一个进程可以使用 IP 地址与端口号 Port 。 字节序 TCP/IP协议规定&#xff0c;网络数据流应采用大端字节序。 大端&#xff1a;低地址存高位&#xff0c…...

qt 在vs2022 报错记录

1&#xff0c;qt.network.ssl: QSslSocket::connectToHostEncrypted: TLS initialization failed 需要把SSL 相关的库加入进去&#xff0c;如ssleay32.dll&#xff0c;libeay32.dll。 2&#xff0c;在一个文件中已定义&#xff0c;编译器在链接时&#xff0c;在多处报 已在.*…...

【人工智能】TensorFlow和机器学习概述

一、TensorFlow概述 TensorFlow是由Google Brain团队开发的开源机器学习库&#xff0c;用于各种复杂的数学计算&#xff0c;特别是在深度学习领域。以下是对TensorFlow的详细概述&#xff1a; 1. 核心概念 张量&#xff08;Tensor&#xff09;&#xff1a;TensorFlow中的基本…...

SQLALchemy 的介绍

SQLALchemy 的介绍 基本概述主要特点使用场景安装与配置安装 SQLAlchemy配置 SQLAlchemy示例&#xff1a;使用 SQLite 数据库连接到其他数据库 结论 总结 SQLAlchemy是Python编程语言下的一款开源软件&#xff0c;它提供了SQL工具包及对象关系映射&#xff08;ORM&#xff09;工…...

Java虚拟机:运行时内存结构

大家好&#xff0c;我是栗筝i&#xff0c;这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 035 篇文章&#xff0c;在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验&#xff0c;并希望进…...

微信小程序子组件调用父组件的方法

来源&#xff1a;通义千文2.5 步骤 1: 定义父组件中的方法 首先&#xff0c;在父组件中定义一个方法&#xff08;如 handleClick&#xff09;&#xff0c;并准备一个用于接收子组件传来的数据的方法。 父组件&#xff08;Parent.wxml&#xff09; html<!-- parent.wxml …...

【数据结构】TreeMap和TreeSet

目录 前言TreeMap实现的接口内部类常用方法 TreeSet实现的接口常用方法 前言 Map和set是一种专门用来进行搜索的容器或者数据结构&#xff0c;其搜索的效率与其具体的实例化子类有关。 一般把搜索的数据称为关键字&#xff08;Key&#xff09;&#xff0c; 和关键字对应的称为…...

前端react集成OIDC

文章目录 OpenID Connect (OIDC)3种 授权模式 【服务端】express 集成OIDC【前端】react 集成OIDCoidc-client-js库 原生集成react-oidc-context 库非组件获取user信息 OAuth 2.0 协议主要用于资源授权。 OpenID Connect (OIDC) https://openid.net/specs/openid-connect-core…...

JavaWeb—XML_Tomcat10_HTTP

一、XML XML是EXtensible MarkupLanguage的缩写&#xff0c;翻译过来就是可扩展标记语言。所以很明显&#xff0c;XML和HTML一样都是标记语言&#xff0c;也就是说它们的基本语法都是标签。 可扩展:三个字表面上的意思是XML允许自定义格式。但这不代表你可以随便写; 在XML基…...

中介者模式在Java中的实现:设计模式精解

中介者模式在Java中的实现&#xff1a;设计模式精解 中介者模式&#xff08;Mediator Pattern&#xff09;是一种行为型设计模式&#xff0c;用于定义一个中介者对象&#xff0c;以封装一系列对象之间的交互&#xff0c;从而使对象之间的交互不再直接发生&#xff0c;减少了系…...

PyQt编程快速上手

Python GUI安装 GUI就是图形用户界面的意思&#xff0c;在Python中使用PyQt可以快速搭建自己的应用&#xff0c;使得自己的程序看上去更加高大上&#xff0c;学会GUI编程可以使得自己的软件有可视化的结果。 如果你想用Python快速制作界面&#xff0c;可以安装PyQt&#xff1a…...

Docker Swarm管理

Docker Swarm管理 前置知识点 Docker Swarm 是 Docker 公司 2014年出品的基于 Docker 的集群管理调度工具&#xff0c;能够将多台主机构建成一个Docker集群&#xff0c;并结合Overlay网络实现容器调度的互访 用户可以只通过 Swarm API 来管理多个主机上的 Docker Swarm 群集包…...

Python | Leetcode Python题解之第335题路径交叉

题目&#xff1a; 题解&#xff1a; class Solution:def isSelfCrossing(self, distance: List[int]) -> bool:n len(distance)# 处理第 1 种情况i 0while i < n and (i < 2 or distance[i] > distance[i - 2]):i 1if i n:return False# 处理第 j 次移动的情况…...

Ubuntu视频工具

1. VLC VLC Media Player&#xff08;VLC多媒体播放器&#xff09;&#xff0c;最初命名为VideoLAN客户端&#xff0c;是VideoLAN品牌产品&#xff0c;是VideoLAN计划的多媒体播放器。它支持众多音频与视频解码器及文件格式&#xff0c;并支持DVD影音光盘&#xff0c;VCD影音光…...

HBase snapshot+replication 测试

一、背景 画像标签服务&#xff08;CDP&#xff09;是核心服务&#xff0c;被公司其他系统如现金、电商、风控等核心业务调用。异常的话&#xff0c;影响范围大。 二、目标 存量数据测试通过 snapshot 迁移。增量数据测试通过 replication 同步。 三、测试 方案二测试&#x…...

代码随想录算法训练营第四十一天|图论基础、深度优先搜索理论基础、98. 所有可达路径、797. 所有可能的路径

图论基础 图的种类&#xff1a;有向图 和 无向图&#xff0c;加权有向图&#xff0c; 加权无向图 无向图中有几条边连接该节点&#xff0c;该节点就有几度。 在有向图中&#xff0c;每个节点有出度和入度。出度&#xff1a;从该节点出发的边的个数。入度&#xff1a;指向该节…...

STM32学习笔记09-SPI通信

目录 SPI通信简介 硬件电路 移位示意图 SPI基本时序单元 SPI时序 W25Q64简介 硬件电路 W25Q64框图 Flash操作注意事项 SPI外设简介 SPI框图 SPI基本结构 主模式全双工连续传输 非连续传输 软件/硬件波形对比 SPI应用 软件SPI读写W25Q64 硬件SPI读写W25Q64 SP…...

树------二叉树

什么是树&#xff1a; 树是一种特殊的结构&#xff0c;由多个节点连接构成&#xff0c;并且不包含回路&#xff0c;也可以认为树是不包含回路的无向连通图&#xff0c;具体如下图所示。 当我们要确定一棵树的形态时&#xff0c;要指定一个根节点&#xff0c;没有父亲节点的节点…...

智能任务调度引擎:重构碧蓝航线自动化管理架构

智能任务调度引擎&#xff1a;重构碧蓝航线自动化管理架构 【免费下载链接】AzurLaneAutoScript Azur Lane bot (CN/EN/JP/TW) 碧蓝航线脚本 | 无缝委托科研&#xff0c;全自动大世界 项目地址: https://gitcode.com/gh_mirrors/az/AzurLaneAutoScript 在移动游戏生命周…...

手把手教你:没有ST-LINK,如何用USB给STM32烧录程序(DFU模式保姆级教程)

零成本玩转STM32&#xff1a;USB-DFU模式烧录全攻略 当你深夜调试STM32项目时&#xff0c;突然发现手边没有ST-LINK&#xff0c;而快递至少要等三天——这种场景我经历过太多次。直到发现DFU模式这个隐藏技能&#xff0c;所有问题迎刃而解。本文将分享如何仅用一根USB线完成固件…...

量子机器学习框架互操作性挑战与解决方案

1. 量子机器学习框架互操作性挑战与解决方案量子机器学习&#xff08;QML&#xff09;作为量子计算与经典机器学习的交叉领域&#xff0c;近年来在理论和实践层面都取得了显著进展。变分量子算法&#xff08;VQAs&#xff09;和参数化量子电路&#xff08;PQCs&#xff09;已成…...

Skill Library:AI智能体技能库的模块化设计与工程实践

1. 项目概述&#xff1a;一个为AI智能体打造的“技能武器库”如果你和我一样&#xff0c;每天都在和Claude、ChatGPT、Cursor这些AI工具打交道&#xff0c;那你肯定也经历过这样的时刻&#xff1a;想让AI帮你写个复杂的SQL查询、设计一个微服务架构&#xff0c;或者起草一份产品…...

思科EIGRP实战:从邻居建立到负载均衡的配置详解

1. EIGRP协议基础与核心机制 EIGRP&#xff08;Enhanced Interior Gateway Routing Protocol&#xff09;作为思科自主研发的动态路由协议&#xff0c;在企业级网络中有着广泛应用。我第一次接触EIGRP是在2013年帮某电商平台改造数据中心网络时&#xff0c;当时就被它独特的混合…...

终极开源语音AI工具包:Sherpa-Onnx一站式解决方案

终极开源语音AI工具包&#xff1a;Sherpa-Onnx一站式解决方案 【免费下载链接】sherpa-onnx Speech-to-text, text-to-speech, speaker diarization, speech enhancement, source separation, and VAD using next-gen Kaldi with onnxruntime without Internet connection. Sup…...

不止于仿真:用Multisim14.0的BUCK电路案例,手把手教你理解CCM/DCM模式与电感计算

从波形到公式&#xff1a;用Multisim 14.0解锁BUCK电路CCM/DCM模式的本质理解 当我们第一次翻开电力电子教材&#xff0c;那些关于BUCK电路工作模式的描述往往显得抽象而晦涩。"连续导通模式(CCM)"、"断续导通模式(DCM)"、"临界电感值"——这些概…...

奇异值分解(SVD):从黑盒到语义空间的一场解剖之旅

转载声明&#xff1a;本文核心思想源自 Jonathon Shlens A Tutorial on Principal Component Analysis、AMS Feature Column on SVD 及 LSA Tutorial 等经典文献&#xff0c;仅对叙述方式与图示进行重构&#xff0c;以适配中文技术社区的阅读语境。0. 开场&#xff1a;如果线性…...

【Midjourney×Photoshop黄金工作流】:20年Adobe+AI实战专家亲授5步无缝整合法,97%设计师尚未掌握的智能修图新范式

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;MidjourneyPhotoshop黄金工作流的范式革命 传统图像创作正经历一场静默却深刻的重构——当 Midjourney 生成的高语义图像与 Photoshop 的像素级控制能力深度耦合&#xff0c;工作流不再只是“AI出图→人…...

逻辑表达式与真值表转换

逻辑表达式与真值表转换 真值表与逻辑表达式是数字电路设计的两种等价表示&#xff0c;掌握它们之间的转换是基本功。 &#x1f3af; 本章学习要点 理解真值表的结构和表示方法掌握从真值表写出逻辑表达式&#xff08;最小项之和&#xff09;掌握从逻辑表达式列出真值表了解最…...