Java数组

Java数组12.Java数组一、什么是数组数组可以理解成一个包含相同类型的有序数字集合也称储存一组数据的空间数组属于引用数据类型int[]a={1,2,3,4,5};集合内的数据称为元素

大家好,又见面了,我是你们的朋友全栈君。

12. Java 数组

一、什么是数组

数组可以理解成一个包含相同类型的有序数字集合 也称储存一组数据的空间

数组属于引用数据类型

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

集合内的数据称为元素 并按顺序排列

每个元素对应一个元素索引 相当于每个数据的编号

索引的排序是从0开始

 

二、数组声明定义的语法

基本语法与变量的声明格式类似

格式:数据类型 变量名字 = 变量值

数组声明的两种方式:

首选格式(一般使用风格)

String[] args;

字符串数组类型 名字为 args

C/C++风格(方便C/C++编写者阅读和使用)

double = number[];

 

数组如何定义:使用new操作符

数组的两种定义方式:

第一种 动态初始化

构建方法为创建一个int类型引用赋值给number变量 元素的值可以更改

int[] number = new int[2];//单独定义前必须先声明 [2]内为数组的长度
int[0] = 1;//赋值给元素索引0 数组的第一个数据

没有被赋值的元素为默认值 称为隐式初始化

 

第二种 静态初始化

把包含元素的一组数据赋值给int数据类型的number变量

int[] number = {1,2,3,4,5,6,7,8,9,10};//声明和定义用一段语句来完成

静态初始化后的元素被赋予的值不能改变

 

定义数组的长度:

int[] number = int[10];//声明并定义一个数组长度为10

循环的范围是数组索引最后一个为止 元素下标是从0到9

for (int i = 0,i < number.length,i++){};

给某个索引赋值时不能大于数组的长度 否则会导致数组下标越界异常

int[9] = 1;//这个一个错误的语句

 

总结数组的四个特点:

  1. 数组的长度在创建后就不能改变。

  2. 数组内的元素必须是同种类型的数据。

  3. 数组内的元素可以是基本类型也可以是引用类型

  4. 数组属于引用类型数据,所以可以把数组看成一个对象,数组内的元素可以看出是成员变量。数组对象是被储存在堆里的。

 

三、数组定义简易分析图

Java内存简易的划分为三个区域:栈、堆(包含方法区)。

  1. 栈:存放基本数据类型(包含这个数据类型的具体数据)。

  2. 堆:存放new创建的对象和数组(包括每个数组元素的值)。

  3. 方法区:包含所有class和static修饰符的方法。

 

分析图:

<span role="heading" aria-level="2">Java数组

  1. 当一个数组类型的变量被声明后,在内存中会在栈里生成一个该数组的变量名。

  2. 当使用new操作符定义了数组的大小后,在堆里面创建数组每个元素为默认值的内存。

  3. 数组的每个元素被定义,会对堆中原有的数组内存进行更新。

四、数组的使用

使用数组的三种方式:

  1. 使用普通for循环和增强for循环 打印每个元素

  2. 把数组数据类型的参数传递给void无返回值的函数

  3. 把数组参数传递给有返回值的函数

 

1. 使用for循环和增强for循环的案例

for循环:

案例:打印数组内每个元素:

image-20210831222007572

由于每一个数组含有多个元素 定义数组的索引为for循环的变量

增强for循环:

案例:打印数组内每个元素

image-20210831222241409

增强for循环的变量用来声明数组的元素

表达式为要访问的数组

 

2. 定义数组变量传递给空返回值的函数

案例:选出数组中所有奇数

image-20210831223817884

将数组变量传递给函数输出

 

3. 定义数组参数给有返回值的函数并输出返回值

案例:反转数组中的元素

image-20210831230653263

 

编程原理:

  1. 首先把传递参数ars数组的长度赋值给result 用于之后返回实参

  2. 创建含有2个变量的循环结构

i变量为ars数组的下标 初始值为0 是ars数组的第一个元素 j变量为result数组的下标 初始值result数组长度为4 是result数组的最后一个元素 i变量的更新方式是自增 j变量的更新方式是自减

循环的表达公式就为:ars数组的第一个元素将result数组的最后一个元素的值覆盖掉

如:

result[4] = ars[0] result数组:{0,0,0,0,1}

result[3] = ars[1] result数组:{0,0,0,2,1}

result[2] = ars[2] result数组:{0,0,3,2,1}

result[1] = ars[3] result数组:{0,4,3,2,1}

result[0] = ars[4] result数组:{5,4,3,2,1}

  1. result数组为{5,4,3,2,1}返回到ars形参中

  2. 使用引用的方式调用反转函数并循环输出

 


五、多维数组

多维数组实质意义上就是数组的嵌套使用

比如二维数组中的元素不是数字而是另一个数组

创建一个多维数组:

int[][] = new int[5][2];

第一个中括号表示最外层的数组长度为5

第二个中括号表示里面的数组长度为2

展开的数组如下:

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

{1, 2}可以看成是最外层数组的一个元素

简易分析图:

image-20210902231656067

二维数组嵌套两层 n维数组嵌套n层 以此类推

 

拓展:稀疏数组

定义:若一个数组中含有大量0元素,相同元素。

可以使用稀疏数组进行压缩,将不为0的元素抽取出来储存,从而达到节约空间的作用。

稀疏数组是一种数据结构。

使用案例:

多维数组压缩和读取

左边是原始数组 右边为压缩后的稀疏数组也叫稀疏矩阵

<span role="heading" aria-level="2">Java数组

稀疏矩阵的参数:

  1. row 表示数组行下标 第一行的row表示整个数组总共有多少行

  2. col 表示数组列下标 第一行的col表示整个数组总共有多少列

  3. value 表示每个坐标对应的元素 第一行的value表示整个数组总共有多少个元素

以下是原数组的代码:

image-20210907225727002

 

遍历完所有元素后 就需要把所有的无效元素剔除掉

然后需要再遍历一次数组找到那些有效的值

image-20210907225813925

确定了有效元素后 便可以创建稀疏数组的列表了

 

按照列表格式创建列表头:

总共有3列值 分别是 行 列 值

image-20210907225941385

稀疏数组总共有多少行取决于原数组的有效元素有多少个 在这个基础上要加上列表头的那一行 所以就是count + 1

稀疏数组总共有3列 所以数组长度为3

 

稀疏数组的列表头构建好之后

接下来就是定义每个有效元素所在的坐标

image-20210907230128376

经过以上步骤已经成功压缩数组

 

当需要读取原数组内的所有元素时,则需要通过稀疏数组进行还原

代码如下:

image-20210907230312812

 


 

六、Arrays类

数组工具类Java.until.Arrays

为数组对象提供一些简单操作的类

Arrays常用方法:

1. 打印数组的每一个元素

Arrays.tostring(int[]);

参数:

int[] 打印的指定数组名

2. 填充数组元素

Arrays.fill(int[], fromIndex, toIndex, val);

参数:

int[] 被分配的指定数组名

fromIndex 分配索引的范围的第一个元素索引 被填充的范围包括此索引

toIndex 分配索引范围的最后一个元素索引 小于此索引

val 分配给数组元素的指定值

3. 对数组元素进行排序 升序形式

Arrays.sort(int[]);

参数:

int[] 进行排序的指定数组名

4. 使用二进制算法搜索数组指定元素的索引

Arrays.binarySearch(int[], key);

注意事项是在数组被排序过才能使用该方法

参数:

int[] 被搜索的指定数组名

key 指定数组的元素

 


七、数组冒泡排序

原理:

相邻两个元素比较大小。前一个元素比后一个元素大,就交换位置。直到交换到最后一个元素。

每交换一轮,较大的元素会被排在最后面,较小的元素则会排在最前面

每轮排序的元素越来越少,直到没有元素可以交换为止。

冒泡排序代码如下:

<span role="heading" aria-level="2">Java数组

 

内部相邻两个元素交换数值的代码分析如下:

image-20210905105735574

 

由于每轮排序可能会遇到有相邻两个元素不用交换。

冒泡排序还是会依次走访每一个元素,判断之后才决定是否跳到下一个。

可以写一个优化排序的方法。如果遇到不需要排序的元素时,跳出

在外层循环下定义一个标识位:

<span role="heading" aria-level="2">Java数组

 

在内层循环下写上一个语句:

<span role="heading" aria-level="2">Java数组

每次交换数据时 标识位布尔值为true

 

内层循环结束后建立一个if结构:

<span role="heading" aria-level="2">Java数组

内层循环结束后如果没有交换数据 就跳出循环

 



版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/154420.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Automation服务器不能创建对象(金税盘)

    Automation服务器不能创建对象(金税盘)  1.安装防伪开票组件接口软件;  2.把接口的注册文件放到%防伪开票系统的安装目录%\BIN下  3.把%防伪开票系统的安装目录%\bin下的TaxCardX.dll文件复制至c:\windows\system32下  4.注册dll:在开始菜单中选择”运行”,输入”regsvr32TaxCardX.dll”5.  备注:此处电脑可能会提示不兼容,如:  …

  • SPI协议详解(图文并茂+超详细)

    SPI协议详解(图文并茂+超详细)先说串口因为之前写过一篇UART,通用串行异步通讯协议,UART的相关资料因为UART没有时钟信号,无法控制何时发送数据,也无法保证双发按照完全相同的速度接收数据。因此,双方以不同的速度进行数据接收和发送,就会出现问题。如果要解决这个问题,UART为每个字节添加额外的起始位和停止位,以帮助接收器在数据到达时进行同步;双方还必须事先就传输速度达成共识(设置相同的波特率,例如每秒9600位)。传输速率如果有微小差异不是问题,因为接收器会在每个字节的开头重新同步。相应的协议如下图所示;如果您注意到

  • linux如何mount挂载磁盘并设置开机自动mount

    linux如何mount挂载磁盘并设置开机自动mount知道大家时间都很宝贵,我直接把流程命令写下来,大家配置完即可,想研究原理的话就往下读fdisk-l#查看可挂载的磁盘df-h#查看已经挂载的磁盘mkfs.ext4/dev/vdb#初始化磁盘mount/dev/vdb/u01…

  • 个人数字作品合作协议

    个人数字作品合作协议个人数字作品合作协议甲方:地址:身份证号:联系方式:乙方:北京创新乐知网络技术有限公司地址:北京市朝阳区酒仙桥路10号恒通商务园B8b二层本协议系由北京创新乐知网络技术有限公司(以下简称”CSDN”)与所有通过CSDN下载平台发布作品的用户就资源的引入、使用及相关服务所订立的有效合约,您必须同意并遵守本协议。您通过任何方式参与数字作品提交均被视为您完全接受本协议。本协议具有合同效力。一、总则1.1本协议内容包括协议正文及所有CSDN及CSDN下载平台已经发布的或将来.

  • SCI论文投稿信(Cover Letter)的写法及模版

    SCI论文投稿信(Cover Letter)的写法及模版一、写法投稿信(CoverLetter)应该简述所投稿件的核心内容、主要发现和意义,拟投期刊,对稿件处理有无特殊要求等(如“nottoreview”list)。另外,请附上主要作者的中文姓名、通讯地址、电话、传真和e-mail地址。此外有的杂志要求推荐几位审稿人及其联系方式。以及谁已经阅读过该文(当然是牛人)。一般来说,杂志通常要求说明你论文研究的意义,以及与这个杂志的相关性,另外还有…

  • 竞争的关键驱动的异步通知

    竞争的关键驱动的异步通知

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号