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

2.1 数组

2.1 数组

(1) 概述

定义

在计算机科学中,数组是由一组元素(值或变量)组成的数据结构,每个元素有至少一个索引或键来标识

因为数组内的元素是连续存储的,所以数组中元素的地址,可以通过其索引计算出来,例如:

int[] array = {1,2,3,4,5}

知道了数组的数据起始地址 B a s e A d d r e s s BaseAddress BaseAddress,就可以由公式 B a s e A d d r e s s + i ∗ s i z e BaseAddress + i * size BaseAddress+isize 计算出索引 i i i 元素的地址

  • i i i 即索引,在 Java、C 等语言都是从 0 开始
  • s i z e size size 是每个元素占用字节,例如 i n t int int 4 4 4 d o u b l e double double 8 8 8

小测试

byte[] array = {1,2,3,4,5}

已知 array 的数据的起始地址是 0x7138f94c8,那么元素 3 的地址是什么?

答:0x7138f94c8 + 2 * 1 = 0x7138f94ca

空间占用

Java 中数组结构为

  • 8 字节 markword
  • 4 字节 class 指针(压缩 class 指针的情况)
  • 4 字节 数组大小(决定了数组最大容量是 2 32 2^{32} 232
  • 数组元素 + 对齐字节(java 中所有对象大小都是 8 字节的整数倍[^12],不足的要用对齐字节补足)

例如

int[] array = {1, 2, 3, 4, 5};

的大小为 40 个字节,组成如下

8 + 4 + 4 + 5*4 + 4(alignment)

随机访问性能

即根据索引查找元素,时间复杂度是 O ( 1 ) O(1) O(1)

2) 动态数组

java 版本

public class DynamicArray implements Iterable<Integer> {private int size = 0; // 逻辑大小private int capacity = 8; // 容量private int[] array = {};/*** 向最后位置 [size] 添加元素** @param element 待添加元素*///在数组末尾添加元素public void addLast(int element) {add(size, element);}/*** 向 [0 .. size] 位置添加元素** @param index   索引位置* @param element 待添加元素*///在指定位置index添加元素public void add(int index, int element) {checkAndGrow();// 添加逻辑if (index >= 0 && index < size) {// 向后挪动, 空出待插入位置System.arraycopy(array, index,array, index + 1, size - index);}array[index] = element;size++;}
//如果容量为0,则创建一个初始容量为8的数组,如果大小超过容量,则进行容量的1.5倍扩容private void checkAndGrow() {// 容量检查if (size == 0) {array = new int[capacity];} else if (size == capacity) {// 进行扩容, 1.5 1.618 2//移位运算符,>>1即除以2,然后再加上之前的容量,即为1.5倍扩容capacity += capacity >> 1;int[] newArray = new int[capacity];//扩容逻辑,先复制原本的数组里面的元素,再创建一个新的数组,容量为原数组的1.5倍,//然后把复制的元素复制到新数组里面之后,再进行元素的添加System.arraycopy(array, 0,newArray, 0, size);array = newArray;}}/*** 从 [0 .. size) 范围删除元素** @param index 索引位置* @return 被删除元素*/public int remove(int index) { // [0..size)int removed = array[index];//删除逻辑,指定删除元素的索引+1开始的元素以及后面的所有元素复制一遍,把指定元素移除后//再将复制的元素放进来,也就是后面的元素往前面移动一位if (index < size - 1) {// 向前挪动System.arraycopy(array, index + 1,array, index, size - index - 1);}size--;return removed;}/*** 查询元素** @param index 索引位置, 在 [0..size) 区间内* @return 该索引位置的元素*/public int get(int index) {//直接返回查询元素的索引return array[index];}/*** 遍历方法1** @param consumer 遍历要执行的操作, 入参: 每个元素*///调用java的Consumer接口,然后是包装的泛型整型public void foreach(Consumer<Integer> consumer) {for (int i = 0; i < size; i++) {// 提供 array[i]// 返回 voidconsumer.accept(array[i]);}}/*** 遍历方法2 - 迭代器遍历*/@Override//调用java的迭代器遍历public Iterator<Integer> iterator() {return new Iterator<Integer>() {int i = 0;@Overridepublic boolean hasNext() { // 有没有下一个元素return i < size;}@Overridepublic Integer next() { // 返回当前元素,并移动到下一个元素return array[i++];}};}/*** 遍历方法3 - stream 遍历** @return stream 流*///调用java的stream流遍历public IntStream stream() {return IntStream.of(Arrays.copyOfRange(array, 0, size));}
}
  • 这些方法实现,都简化了 index 的有效性判断,假设输入的 index 都是合法的
  • 测试代码时,养成用断言assert去判断,而不是将其打印出来

插入或删除性能

头部位置,时间复杂度是 O ( n ) O(n) O(n)

中间位置,时间复杂度是 O ( n ) O(n) O(n)

尾部位置,时间复杂度是 O ( 1 ) O(1) O(1)(均摊来说)

http://www.lryc.cn/news/281701.html

相关文章:

  • 超维空间M1无人机使用说明书——53、ROS无人机二维码识别与降落——V2升级版本
  • 瑞萨IDE:CS+ for CC进行BootLoader升级时开发环境配置
  • 翻译: Streamlit从入门到精通 显示图表Graphs 地图Map 主题Themes 二
  • Java 开源扫雷游戏 JMine 发布新版 3.0 及介绍视频
  • Vue v-model 详解
  • 一个超级牛逼的消息推送系统Gotify 使用Gotify来搭建你的消息推送系统
  • 【架构设计】单体软件向微服务化演变
  • 部署ATS(Apache Traffic Server)和Nginx正向代理服务性能对比
  • kafka入门(六):日志分段(LogSegment)
  • Python 与 PySpark数据分析实战指南:解锁数据洞见
  • docker使用nginx部署vue刷新页面404
  • openGauss学习笔记-198 openGauss 数据库运维-常见故障定位案例-分析查询效率异常降低的问题
  • 使用Map.clear()、List.clear()方法,清空时注意!
  • 如何配置Pycharm服务器并结合内网穿透工具实现远程开发
  • c++中的以及链表的基础使用
  • vue v-for循环拖拽排序,实现数组选中的数据拖拽后对应的子数据也进行重新排序
  • google cloud storage批量文件下载
  • easyexcel 3.0.x 版本实现指定列 锁定以及指定列隐藏
  • whistle代理+mock轻松解决“页面端“测试接口没数据难题
  • HNU-计算机网络-实验5(自选)-安全相关编程实验
  • Ubuntu搭建OpenCV环境(C++)
  • R语言【paleobioDB】——pbdb_orig_ext():绘制随着时间变化而出现的新类群
  • Vue模板的理解和使用
  • mysql group_concat函数使用
  • 并发编程之三大特性及JMM内存模型
  • centos系统设置runlevel为5
  • 关于群晖ARPL界面能出现ip但是使用Synology Assistant搜索不到ip问题 及解决方法
  • mysql Linux系统云服务器配置远程访问
  • 使用WAF防御网络上的隐蔽威胁之SQL注入攻击
  • 【书生·浦语】大模型实战营——第五次课程作业