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

day6:数组

一、数组

1. 概念: 可以通同时存储多个 相同类型的数据,并且可以对其中的多个数据统一操作。

2. 使用数组的流程:

(1) 声明:指定数组的存储数据类型,同时指定数组名

数据类型[] 数组名; // int[] a; 建议写法

// int []a; int a[];

(2) 分配空间:指定数组的 长度

数组名 = new 数据类型[长度];

(3) 使用数组:【基础重点】

a. 数组中存储的数组被称为数组元素。

b. 对数组的操作分为:存元素 和 取元素

c. 对数组的存取元素通过数组名 和下标进行操作:

存元素: 数组名[下标] = 值;

取元素: 数组名[下标]

d. 对数组的每一个空间进行编号,这个编号被称为下标。

数组的下标范围: 0 ~ 数组长度-1

e. 如果操作数组时,指定的数组下标不在 0~数组长度-1的范围内,编译通过,

运行报错,错误信息为:java.lang.ArrayIndexOutOfBoundsException(数组的下标越界)

f. 数组的遍历:对数组中的元素进行一一访问的过程。

// 用循环的变量 控制 数组的下标

for(int i=0;i< 数组的长度;i++){

// 通过 a[i] 操作数组的每一个元素

}

获取数组的长度: 数组名.length

3. 数组具有默认值值,默认值情况如下:【掌握】

(1) 整数: 0

(2) 小数:0.0

(3) 布尔:false

(4) 字符:空字符 (\u0000)

(5) 对象/引用:null

4. 数组的其他定义方式:【多练】

(1) 声明的同时分配空间:数据类型[] 数组名 = new 数据类型[长度];

(2) 显示初始化:数据类型[] 数组名 = new 数据类型[]{值1,值2,值3};

注意:[]中不能再指定数组的长度,长度有{}中值个数决定。

(3) 显示初始化:数据类型[] 数组名 = {值1, 值2, 值3};

注意:声明和初始化必须一起完成,同时数组的长度由{}中值个数决定。

int[] a ;

a = {1,7,4}; //error错误

二、数组的内存【难点+理解】

1. 数组在内存中空间是连续的。

2. 数组名存储的是 数组在 内存中的首地址。

3. 计算机中的寻址方式:首地址 + 下标 * 每一个存储空间的字节数。---》(数组名[下标])

4. 数组下标从 0开始,是为了提高 寻址效率。

5. 数组类型的变量相互赋值,传递的是数组在内存中首地址。

基本数据类型变量相互赋值,传递的是数值。

三、数组的扩容

1. 扩容思想:【理解】

(1) 先申请一个更大空间的新数组,通常新数组长度为原数组长度的2倍

(2) 将原数组中的元素进行一一复制到新数组中

(3) 新地址 覆盖 旧地址

2. 数组扩容实现的方式:

(1) 第一种方式

int[] a = new int[]{1,7,4,3};

// 1. 申请新数组 :长度为原有数组的2倍

int[] b = new int[a.length*2];

// 2. 将原有数组中内容进行一一拷贝到新数组中

for(int i=0;i<a.length;i++){

b[i] = a[i];

}

// 3. 新的地址覆盖旧的地址

a = b;

~~~

(2) 利用 System.arraycopy(a,0,b,0,a.length); // 完成 数组复制

参数说明:第一个参数:原数组名

第二个参数:原数组拷贝的起始下标

第三个参数:新数组名

第四个参数:新数组的存储起始下标

第五个参数:拷贝的个数/长度

(3) 利用 java.util.Arrays.copyOf(原数组名,新数组的长度) ; // 完成新数组的定义+数组的复制

参数说明:第一个参数:扩容的数组名

第二个参数:指定新数组的长度

四、可变长参数【阅读源码和API时经常遇到】

1. 可变长参数:函数可以接受个数不固定的实参,jdk5.0 提出的概念。

2. 注意:参数的个数由调用者调用数给定 个数确定;可变长参数可以接受不等数量的相同类型的数据。

3. 语法: public static 返回值类型 函数名(数据类型... 变量名){}

4. 使用:可变长参数会自动生成对应类型数组,所以在函数中直接将 可变长参数当做数组应用即可。

5. 语法规定:一个函数中最多只能定义一个可变长参数,并且可变长参数必须定义在形参最后一个位置。

6. 可变长参数:可以提高代码的灵活度。

五、数组的排序【面试重点】

1. 冒泡排序法:将相邻的两个元素进行一一比较,元素大逐步往后移。 (从小到大排序)

2. 选择排序:固定一个下标对应的元素,和其他元素进行一一比较,较小数据逐步往前移。(从小到大排序)

3. 利用 java.util.Arrays.sort(数组名); 进行排序 ---》快速排序

六、二维数组【了解即可】

1. 语法:

(1) 声明:数据类型 [] [] 数组名;

(2) 分配空间:数组名 = new 数据类型[行数] [列数]; // 行 又称为高维 列:低维

2. 二维数组的使用:

(1) 通过行和列对二位数组进行访问:数组名[行标] [列标]

注意:行标和列表都是从 0 开始

例如: a[0] [3] // 第0行第3列的元素

(2) 二维数组也具有默认值,同一维数组

(3) 获取二维数组的行数: 数组名.length

列数:数组名[行标].length

注意:二维数组是一维数组的一维数组。

3. 二维数组的其他定义方式

(1) 声明的同时并分配空间:数据类型[][] [] [] 数组名 = new 数据类型[行数] [列数];

(2) 显示初始化:数据类型[] [] 数组名 = new 数据类型[] []{{值1,值2},{值3,值4},{值5,值6}};

注意:后面 {} 中 {}的个数决定行数,所以[] []中个不能再制定行数和列数。

(3) 显示初始化:数据类型[] [] 数组名 = {{值1,值2},{值3,值4}};

注意:声明和初始化必须一起完成。

4. 不规则的二维数组

(1) 概念:每一行的列数不相同

(2) 不规则的二维数组的定义方式:

a. 数据类型[] [] 数组名 = new 数据类型[行数] [];

数组名[0] = new 数据类型[长度];

数组名[1] = new 数据类型[长度];

....

注意:二维数组定义可以只指定行数/高维,但是不能只指定列数/低维

b. 数据类型[] [] 数组名 = {{值1},{值1,值2,值3},{值1,值2}};

http://www.zskr.cn/news/1418215.html

相关文章:

  • git教程使用的一些心得
  • 逆向入门必看:从导入表和重定位表理解Windows程序如何‘跑起来’
  • Chiplet 架构下嵌入式 SoC 的模块化设计与功耗管理
  • 别再只会调sklearn的PCA了!手把手带你用NumPy从零实现PCA降维(附鸢尾花数据集实战)
  • 全屋定制怎样避坑?
  • MU1定位抓拍雷达软件调试指导
  • 告别手动插拔!用ControlMyMonitor+WinHotKey,一键切换显示器信号源(保姆级教程)
  • 5步搞定网页视频下载:猫抓浏览器扩展终极指南 [特殊字符]
  • Win11 Beta版更新总报错0xc1900101?别急着重装,试试这个关闭设备加密的完整流程
  • 六边形网格表面码的硬件优化与缺陷处理方案
  • 北京小程序开发周期全解析:从需求到上线的详细时间指南
  • 从Windows转投Deepin?手把手教你用Ventoy制作多系统启动盘,一次搞定安装
  • 人形机器人谐波关节模组驱动齿轮超高耐磨复合材料注塑解决方案
  • Pythonio字节流与文本流
  • 英语句法分析
  • 2026年科华UPS电源采购,北京哪家靠谱?
  • qmcdump:如何用3步解锁QQ音乐加密文件实现跨平台播放自由
  • 别再只盯着折射率了!ZEMAX热分析中,空气间隔和机械半口径(MCSD)才是关键
  • 别再只盯着TXOUTCLK了!手把手教你用FPGA的RXOUTCLK(线路恢复时钟)驱动RXUSRCLK
  • 深入UGUI底层:手把手教你用OnPopulateMesh和顶点偏移,实现Image的任意2D变形
  • Keil µVision编译错误信息缺失的McAfee杀毒软件解决方案
  • 别再乱改权限了!用微软官方AccessChk工具,5分钟排查Windows系统安全漏洞
  • 从‘克莱因四元群’到‘复数旋转’:手把手带你验证两个群是否同构(附Python代码)
  • Linux系统通过stty命令修改串口波特率
  • 2026公考机构深度横评:粉笔、华图、中公哪家强?
  • 保姆级教程:在Ubuntu 22.04上挂载VMFS6数据存储,轻松读取ESXi虚拟机文件
  • 从PR调色到Unity渲染:用Post Processing的Color Grading模块打造电影感游戏画面
  • 国产化存储实战:在银河麒麟V10 SP1服务器上配置iSCSI多路径(含multipath避坑指南)
  • 卡牌抽取游戏
  • 别再死记硬背了!用‘找书’和‘找章节’的比喻,5分钟搞懂Linux内存管理中的一级/二级页表