数组的实现原理(Java版)

news/2024/9/29 22:02:40/

 

目录

一.数组是什么?

内存分配:

特点:

数组的实现原理:

时间复杂度:

二.Java数组的实现:

总结:


一.数组是什么?

数组(Array) 是一种数据结构,用于存储相同类型的元素集合。数组在内存中是连续分配的,所有的元素都使用相同的数据类型,并且可以通过下标(索引)来访问特定元素。数组是一种常见的线性数据结构,适合用于高效的随机访问操作。

内存分配:

//8字节的markword
//4字节的class指针(压缩class指针的情况)
//4字节的数组大小(决定了数组最大容量是2的32次方)
//java中所有的对象大小都是8字节的整数倍,不足的要用对齐字节补足
//int[] array = {1,2,3,4,5} => 8 + 4 + 4 + 5 * 4 + 4(alignment补齐) = 40字节

特点:

  1. 固定大小数组在创建时需要指定大小,大小一旦确定,不能更改。
  2. 连续内存空间数组的元素在内存中是连续存储的,这使得它在读取时可以快速通过索引定位。
  3. 索引从0开始数组的索引是从0开始的,第一个元素的索引是0,最后一个元素的索引是 长度 - 1
  4. 相同类型元素数组中的所有元素必须是相同的数据类型。

数组的实现原理:

  • 存储结构数组在内存中以连续的地址空间存储。假设数组的起始地址为 base_address,每个元素的大小为 size,则索引为 i 的元素的地址为 base_address + i * size。这使得数组可以通过索引在常数时间内(O(1))访问任意元素。

  • 访问时间复杂度:由于数组元素在内存中的地址是可以直接计算的,数组的读取操作(通过索引)时间复杂度为 O(1),即随机访问非常高效。

  • 缺点:由于数组大小固定,插入和删除操作在数组中相对较慢,特别是当需要在数组中间插入或删除元素时,时间复杂度为 O(n)

时间复杂度:

访问元素O(1)直接通过索引访问
修改元素O(1)直接通过索引修改
查找元素O(n)必须遍历整个数组(线性查找)
插入元素O(n)插入元素需要移动后续元素
删除元素O(n)

删除元素后需要移动后续元素

二.Java数组的实现:

Java的数组扩容机制:先创建更大容量的数组,然后将原来数组内的元素复制到新的数组,以此用新数组代替旧数组

java">package ArrayStudy;import java.util.Arrays;
import java.util.Iterator;
import java.util.function.Consumer;
import java.util.stream.IntStream;public class ArrayListCreateCode implements Iterable<Integer> {//创建动态数组ArrayList//size => 动态数组有效元素个数//容量扩容 => 先创建更大容量的数组,然后将原来数组内的元素复制到新的数组,以此用新数组代替旧数组private int size = 0;//逻辑大小private int capacity = 8;//容量private int[] array = {};//空数组,懒加载(刚开始没用就不数组的情况就不会加载,如果需要此数组就)//新增元素public void addList(int element){
//        array[size] = element;
//        size++;add(size, element);}// 插入元素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++;}private void checkAndGrow() {if(size == 0){array = new int[capacity];}else if(size == capacity){// 进行扩容 1.5倍capacity += capacity >> 1;int[] newArray = new int[capacity];System.arraycopy(array, 0, newArray, 0, size);array = newArray;// 新数组取代旧数组}}// 获取元素public int get(int index){return array[index];}// 遍历数组 => 以函数式接口的形式写出public void foreach(Consumer<Integer> consumer){for(int i = 0; i < size; i++){System.out.println(array[i]);// 返回void// 提供array[i]// 上两条分析后可以使用Consumerconsumer.accept(array[i]);}}// 迭代器遍历@Overridepublic Iterator<Integer> iterator(){// 匿名内部类return new Iterator<Integer>() {int i = 0;@Overridepublic boolean hasNext() {// 有没有下一个元素return i < size;}@Overridepublic Integer next() {// 返回当前元素,并移动到下一个元素return array[i++];}};}// (整数)流的遍历public IntStream stream(){return IntStream.of(Arrays.copyOfRange(array,0,size));// 选择有效部分流式返回}// 删除元素public int remove(int index){int removed = array[index];System.arraycopy(array,index + 1,array,index,size - index - 1);size--;return removed;}
}

总结:

  • 数组 是存储相同类型数据的基本数据结构,它提供了高效的随机访问。
  • 数组的主要操作包括访问、修改、遍历、获取长度等。
  • 数组的时间复杂度很高效(访问O(1),但插入和删除需要O(n))。

http://www.ppmy.cn/news/1532106.html

相关文章

基于SpringBoot+Vue的旅游攻略平台管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

制造企业如何提升项目管理效率?惠科股份选择奥博思PowerProject项目管理系统

全球知名的显示方案综合服务商 - 惠科股份有限公司与北京奥博思达成合作&#xff0c;基于奥博思 PowerProject 搭建企业级项目管理平台。满足惠科多产品多业务领域的项目全周期管理。助力企业在技术研发、产品创新等方面继续取得行业领先优势。 同时&#xff0c;PowerProject …

vincent,一个超酷的Python库

vincent 是一个基于 Python 的可视化库&#xff0c;专门用于生成交互式的图表和可视化数据。它基于 Vega 和 Vega-Lite&#xff0c;提供了丰富的图表类型和自定义选项&#xff0c;使数据可视化变得更加简单直观。通过 vincent&#xff0c;程序员可以轻松地将数据转换为精美的图…

Vue76 编程式路由导航

笔记 作用&#xff1a;不借助<router-link> 实现路由跳转&#xff0c;让路由跳转更加灵活 具体编码&#xff1a; //$router的两个API this.$router.push({name:xiangqing,params:{id:xxx,title:xxx} })this.$router.replace({name:xiangqing,params:{id:xxx,title:xxx} …

.net 之内存回收

前言 一些基本概念如下: 托管代码 托管代码就是执行过程交由运行时管理的代码。 在这种情况下&#xff0c;相关的运行时称为公共语言运行时 (CLR)&#xff0c;不管使用的是哪种实现&#xff08;例如 Mono、.NET Framework 或 .NET Core/.NET 5&#xff09;。 CLR 负责提取托…

若依生成主子表

一、准备工作 确保你已经部署了若依框架&#xff0c;并且熟悉基本的开发环境配置。同时&#xff0c;理解数据库表结构对于生成代码至关重要。 主子表代码结构如下&#xff08;字表中要有一个对应主表ID的字段作为外键&#xff0c;如下图的customer_id&#xff09; -- ------…

InternVL 微调实践

任务 follow 教学文档和视频使用QLoRA进行微调模型&#xff0c;复现微调效果&#xff0c;并能成功讲出梗图. 复现过程 参考教程部署&#xff1a;https://github.com/InternLM/Tutorial/blob/camp3/docs/L2/InternVL/joke_readme.md 训练 合并权重&&模型转换 pyth…

lua基础语法

Lua 是一种轻量级的脚本语言&#xff0c;它以其简洁和灵活性而闻名。以下是 Lua 基础语法的一些关键点&#xff1a; 1. 变量声明 Lua 中的变量声明需要使用 local 关键字&#xff0c;表示变量的作用域仅限于当前区块。 local x 10 -- 局部变量 x 20 -- 全局变量&a…