算法与数据结构之数组(Java)

目录

1、数组的定义

2、线性结构与非线性结构

3、数组的表现形式

3.1 一维数组

3.2 多维数组

4、重要特性:随机访问

5、ArrayList和数组

6、堆内存和栈内存

7、数组的增删查改

7.1 插入数据

7.2 删除一个数据

7.3 修改数组

7.4 查找数据

8、总结

什么是数组?

1、数组的定义

所谓数组,是有序的元素序列。如将有限个类型相同的变量的集合命名,那么这个名称就是数组名。

数组是用于存储多个相同类型数据的集合。通常用Array表示,也称之为线性表。

数组的特点:

(1)数组是相同数据类型的元素的集合(int的数组不能存float,float也不能存double)

(2) 数组中各元素的存储是有先后顺序的,它们在内存中按照这个顺序连续存放到一起。内存地址(连续存储)

(3)数组元素用整个数组的名字和它自己在数组中的顺序位置来表示。例如a[0]表示名字为a的数组中的第一个元素。a[1]表示名字为a的数组中的第二个元素,以此类推。

2、线性结构与非线性结构

3、数组的表现形式

3.1 一维数组

int a[],String b[];

3.2 多维数组

int a[][],String b[][][];//int a[m][n]:内存空间是多少?mxn

4、重要特性:随机访问

数组是连续的内存空间和相同类型的数据。正是因为这两个限制,它才有了这个重要的特性:随机访问。

优势:查找效率高(随机访问的应用)

缺点:删除、插入(效率相对低,因为要根据插入和删除的位置决定;效率低的原因:为了保证连续性,需要做大量的数据搬移工作)

比如往数组中插入一个数据:

删除数组中的某个数据:

使用数组注意事项:使用数组一定要注意访问越界的问题。要多加判断,尤其是开始和结束,测试的时候也要注意头尾。

5、ArrayList和数组

本质上是一样的,都是数组。ArrayList是JDK封装了。不需要管扩容等操作。

数组的话就是要你全部操作。

两者之间如何选择?

1、不知道数据大小的肯定选ArrayList(不需要管理扩容操作)

2、如果知道数据大小且非常关注性能的就选数组

6、堆内存和栈内存

Java分为堆栈两种内存(C语言同理)

什么是堆内存?(FIFO)

存放new 创建的对象和数组。

什么是栈内存?

引用变量(FILO)

堆栈区别:

栈:为编译器自动分配和释放,如函数参数、局部变量、临时变量等等

堆:为成员分配和释放,有程序员自己申请、自己释放。否则发生内存泄漏。(java自动管理(gc))

1、栈的速度要快

2、栈内存的数据可以共享,主要存一些基本数据类型。

int a = 3; //在栈中创建变量a然后给a赋值,先不会创建一个3,而是先在栈中找有没有3,如果有直接指向。
//如果没有就加一个3进来int b = 3; //首先也要创建一个变量b

7、数组的增删查改

private int index;//数组已存在数据的大小private int size;//数组大小private int data[];//数组定义

7.1 插入数据

public void insert(int loc, int n) {if (index++ < size) {//从后开始遍历,遍历到需要插入的位置,开始后移数据for (int i = size - 1; i > loc; i--) {//数据往后移动data[i] = data[i - 1];}//在loc位置插入n值data[loc] = n;} else {//扩容this.size = size * 2 + 1;int[] newData = new int[this.size];for (int i = 0; i < data.length; i++) {newData[i] = data[i];}this.data = newData;//从后开始遍历,遍历到需要插入的位置,开始后移数据for (int i = size - 1; i > loc; i--) {//数据往后移动data[i] = data[i - 1];}//在loc位置插入n值data[loc] = n;}}

7.2 删除一个数据

    public void delete(int loc) {//O(n)for (int i = loc; i < size - 1; i++) {//判断不是最后一个,如果是组后一个则把最后一个数据置为默认值0,就是没存数据if (i != size - 1) {//后面的数据要向前移动,确保连续性data[i] = data[i + 1];} else {data[i] = 0;}}index--;}

7.3 修改数组

public void update(int loc, int n) {//O(1)data[loc] = n;
}

7.4 查找数据

public int get(int loc) {//随机访问O(1)return data[loc];}

8、总结

数组是一个最简单的数据结构。它存储相同类型的一组数据,最大的特点就是下标和随机访问,缺点就是插入和删除都很慢,时间复杂度为O(n)。

思考:1、为什么数组的下标是从0开始呢?(连续存储)

如果不从0开始:就需要操作减法运算,计算机减法操作起来比加法复杂很多,以此优先考虑使用加法进行计算

一维数组的寻址公式:init_loc(初始内存地址) + index(数组下标)*size(数组长度)

loc = init_loc +index * size

2、二维数组的内存地址是怎样的?写出寻址公式?

二维数组的内存地址:

二维转一维:

1 2 3

4 5 6

》1 2 3 4 5 6

=》 4的下标是在二维里面是(1,0)

=》在一维里面是第3个

=》i *n(一维的长度) + j(在列)

==》1 * 3 + 0 = 3

a[i][j]: (i< n, j<n)loc = init_loc + (i *n + j) * size

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

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

相关文章

视频监控可视化云平台EasyCVR智能视频技术优势分析

TSINGSEE青犀视频安防视频管理系统EasyCVR视频智能融合共享平台&#xff0c;是一个支持Windows/Linux(CentOS ubuntu)/国产化系统的视频管理平台。平台可以支持多协议接入&#xff0c;通过视频应用引擎将多种格式的视频数据转换为统一的视频流数据&#xff0c;支持无插件H5直播…

RK3568平台 input输入子系统

一.input子系统简介 Input 子系统是管理输入的子系统&#xff0c; 和 pinctrl 和 gpio 子系统一样&#xff0c; 都是 Linux 内核针对某一类设备而创建的框架。 input 子系统处理输入事务&#xff0c; 任何输入设备的驱动程序都可以通过 input 输入子系统提供的接口注册到内核&…

Java虚拟机介绍

JVM是一种用于计算设备的规范&#xff0c;它是一个虚拟出来的计算机&#xff0c;是通过在实际的计算机上仿真模拟计算机的各个功能来实现的。Java语言的一个非常重要的特点就是与平台的无关性。而使用Java虚拟机是实现这一特点的关键。每个Java虚拟机都着一个清晰的任务&#x…

用通俗易懂的方式讲解大模型:在 CPU 服务器上部署 ChatGLM3-6B 模型

大语言模型&#xff08;LLM&#xff09;的量化技术可以大大降低 LLM 部署所需的计算资源&#xff0c;模型量化后可以将 LLM 的显存使用量降低数倍&#xff0c;甚至可以将 LLM 转换为完全无需显存的模型&#xff0c;这对于 LLM 的推广使用来说是非常有吸引力的。 本文将介绍如何…

Flume基础知识(三):Flume 实战监控端口数据官方案例

1. 监控端口数据官方案例 1&#xff09;案例需求&#xff1a; 使用 Flume 监听一个端口&#xff0c;收集该端口数据&#xff0c;并打印到控制台。 2&#xff09;需求分析&#xff1a; 3&#xff09;实现步骤&#xff1a; &#xff08;1&#xff09;安装 netcat 工具 sudo yum …

SVN服务端的下载、安装

地址 &#xff1a; Apache Subversion Binary Packages 下载 点击 VisualSVN 安装 都是点击 next 点击next &#xff0c;即可安装成功

SpringBoot学习(三)-员工管理系统开发(重在理解)

注&#xff1a;此为笔者学习狂神说SpringBoot的笔记&#xff0c;其中包含个人的笔记和理解&#xff0c;仅做学习笔记之用&#xff0c;更多详细资讯请出门左拐B站&#xff1a;狂神说!!! 本文是基于狂神老师SpringBoot教程中的员工管理系统从0到1的实践和理解。该系统应用SpringB…

B端产品经理学习-需求挖掘

B端产品需求挖掘 目录 识别和管理干系人 决策人和负责人需求挖掘 针对用户进行需求挖掘 用户访谈结果整理 B端产品的需求来源是非常复杂的&#xff0c;要考虑多个方面&#xff1b;如果你是一个通用性的产品&#xff0c;要考虑市场、自身优劣势、干系人。而定制型B端产品会…

uniapp:签字版、绘画板 插件l-signature

官方网站&#xff1a;LimeUi - 多端uniapp组件库 使用步骤&#xff1a; 1、首先从插件市场将代码下载到项目 海报画板 - DCloud 插件市场 2、下载后&#xff0c;在项目中的uni_modules目录 3、最后 没有其它步骤&#xff0c;直接官网代码复制到vue文件中就可以了&#xff0c…

综合跨平台全端ui自动化测试框架Airtest——AirtestIDE录制微信小程序脚本教学

前言 有在自动化测试领域的小伙伴应该都知道&#xff0c;app和小程序自动化这一类的自动化测试在实际操作中有时候很棘手让人心烦&#xff0c;动不动就是用appium写代码脚本维护什么的&#xff0c;不仅步骤繁琐&#xff0c;环境配置方面也是繁琐无比&#xff0c;动不动就与客户…

[足式机器人]Part2 Dr. CAN学习笔记-动态系统建模与分析 Ch02-1+2课程介绍+电路系统建模、基尔霍夫定律

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-动态系统建模与分析 Ch02-12课程介绍电路系统建模、基尔霍夫定律 1. 课程介绍2. 电路系统建模、基尔霍夫定律 1. 课程介绍 2. 电路系统建模、基尔霍夫定律 基本元件&#xff1a; 电量 库伦&…

多模态——旷视大模型Vary更细粒度的视觉感知实现文档级OCR或图表理解

概述 现代大型视觉语言模型&#xff08;LVLMs&#xff09;&#xff0c;例如CLIP&#xff0c;使用一个共同的视觉词汇&#xff0c;以适应多样的视觉任务。然而&#xff0c;在处理一些需要更精细和密集视觉感知的特殊任务时&#xff0c;例如文档级OCR或图表理解&#xff0c;尤其…

前缀和算法 -- 寻找数组的中心坐标

个人主页&#xff1a;Lei宝啊 愿所有美好如期而遇 本题链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 输入描述 给定一个数组&#xff0c;接口为int pivotIndex(vector<int>& nums) 输出描述 我们以示例1为例画图解释&#xf…

DRF从入门到精通七(djangorestframework-simplejwt、定制返回格式、多方式登录)

文章目录 一、djangorestframework-simplejwt快速使用1.基础使用步骤2.自己配置视图校验访问局部配置认证及权限类全局配置认证及权限类 3.关于双token认证问题 二、定制返回格式三、多方式登录 一、djangorestframework-simplejwt快速使用 JWT主要用于签发登录接口需要配合认证…

频谱论文:约束飞行轨迹下基于生成对抗网络的三维无线电地图重构

#频谱# T. Hu, Y. Huang, J. Chen, Q. Wu and Z. Gong, "3D Radio Map Reconstruction Based on Generative Adversarial Networks Under Constrained Aircraft Trajectories," in IEEE Transactions on Vehicular Technology, vol. 72, no. 6, pp. 8250-8255, June …

Vue - 多行文本“展开、收起”功能

TextClamp 使用 js 实现文本展开、收起&#xff0c;并非纯 CSS 实现。 Props&#xff1a; fontSize&#xff1a;Number&#xff0c;默认&#xff1a;14lines&#xff1a;Number&#xff0c;默认&#xff1a;1lineHeight&#xff1a;Number&#xff0c;默认&#xff1a;20 F…

字符编码转换

宽窄字符和字符编码的关系 多字节(窄)字符&#xff1a;在C/C中&#xff0c;char是一种数据类型&#xff0c;规定sizeof(char)1&#xff0c;即一个char占用一个字节&#xff0c;1Byte8bit。并没有规定一个char就要与ASCII对应&#xff0c;不过&#xff0c;通常情况下char值与AS…

2023 年博客总结

当无所事事&#xff0c;没有多少收获的时候&#xff0c;时间过得格外的快… 当充实有为&#xff0c;经常有收获有进步的时候&#xff0c;才觉得时间没有浪费… 2023年收获不多… 以前说孩子小&#xff0c;需要照顾所以没时间&#xff0c;我以为孩子大点就有时间了&#xff0c;…

图片处理相关网站(图片分辨率、尺寸修改、AI扩图等)

分享一些免费的可进行图片的各种处理的网站&#xff0c;包括图片分辨率、尺寸修改、AI扩图等&#xff0c;持续增加中。。。 1.photokit.com 可进行图片分辨率、尺寸、压缩等修改。 免费在线图片编辑器 - 在线抠图、改图、修图、美图 - PhotoKit.comPhotoKit是一款免费的…

【RocketMQ每日一问】RocketMQ SQL92过滤用法以及原理?

1.生产端 public class SQLProducer {public static int count 10;public static String topic "xiao-zou-topic";public static void main(String[] args) {DefaultMQProducer producer MQUtils.createLocalProducer();IntStream.range(0, count).forEach(i -&g…