第四章:数组

2024-01-21 10:51:51 浏览数 (1)

1. 数组的概述

  • 数组的概念:
    • 数组:数组是多个相同类型按一定顺序排列的集合 ,并使用一个名字命名并通过编号的方式对这些数据进行统一管理
    • 数组中的概念
      • 数组名
      • 下标(或索引)
      • 元素
      • 数组的长度
  • 数组的特点:
    • 数组本身是引用数据类型​,而数组中的元素可以是任何数据类型​,包括基本数据类型和引用数据类型。
    • 创建数组对象会在内存中开辟一整块连续的空间​。占据的空间的大小,取决于数组的长度和数组中元素的类型。
    • 数组中的元素在内存中是依次紧密排列的,有序的。
    • 数组,一旦初始化完成,其长度就是确定的。数组的长度一旦确定,就不能修改​。
    • 我们可以直接通过下标(或索引)的方式调用指定位置的元素,速度很快。
    • 数组名中引用的是这块连续空间的首地址
  • 数组的分类
    • 按照元素类型分:
      • 基本数据类型元素的数组:每个元素位置存储基本数据类型的值
      • 引用数据类型元素的数组:每个元素位置存储对象(本质是存储对象的首地址)(在面向对象部分讲解)
    • 按照维度分:
      • 一维数组:存储一组数据
      • 二维数组:存储多组数据,相当于二维表,一行代表一组数据,只是这里的二维表每一行长度不要求一样。

2. 一维数组的使用

2.1 一维数组的声明

格式:

代码语言:javascript复制
//推荐
元素的数据类型[] 一维数组的名称;

//不推荐
元素的数据类型  一维数组名[];

数组的声明 ,需要明确:

  • 数组的维度:在Java中数组的符号是[ ],[ ]表示一维,[ ][ ]表示二维。
  • 数组的元素类型:即创建的数组容器可以存储什么数据类型的数据。元素的类型可以是任意的Java的数据类型。例如:int、String、Student等。
  • 数组名:就是代表某个数组的标识符,数组名其实也是变量名,按照变量的命名规范来命名。数组名是个引用数据类型的变量,因为它代表一组数据。

2.2 一维数组的初始化

静态初始化:

如果数组变量的初始化和数组元素的赋值操作同时进行 ,那就称为数组初始化

静态初始化,本质是用静态数据为数组初始化,此时数组的长度由静态数据的个数决定

一维数组声明和静态初始化格式1:

代码语言:javascript复制
  数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3,...};
  
  或
  
  数据类型[] 数组名;
  数组名 = new 数据类型[]{元素1,元素2,元素3,...};

new:关键字,创建数组使用的关键字。因为数组本身是引用数据类型,所以要用new创建数组实体。

一维数组声明和静态初始化格式2:

代码语言:javascript复制
数据类型[] 数组名 = {元素1,元素2,元素3...};//必须在一个语句中完成,不能分成两个语句写

动态初始化:

数组变量的初始化和数组元素的赋值操作分开进行,即为动态初始化。

动态初始化中,只确定了元素的个数(即数组的长度),而元素值此时只是默认值,还并未真正赋自己期望的值。真正期望的数据需要后续单独一个一个赋值。

格式:

代码语言:javascript复制
数组存储的元素的数据类型[] 数组名字 = new 数组存储的元素的数据类型[长度];

或

数组存储的数据类型[] 数组名字;
数组名字 = new 数组存储的数据类型[长度];


// 举例:动态初始化的写法
int[] arr = new int[5];

[长度]:数组的长度,表示数组容器中可以最多存储多少个元素。

注意:数组有定长特性,长度一旦指定,不可更改。 和水杯道理相同,买了一个2升的水杯,总容量就是2升是固定的。

2.3 一维数组的使用

数组的长度:

  • 数组元素的总个数,即数组的长度
  • 每个数组都有一个属性length指明它的长度 。如:arr.length 指明数组arr的长度(即元素个数)
  • 每个数组都有长度,而且一旦初始化,其长度就是确定,且不可变的

数组元素的引用:数组名[索引或下标]

数组的下标范围:java中数组的小标是从[0] 开始 , 下标范围是[0 , 数组长度 - 1] , 即[0 , 数组名.length - 1]

数组元素下标可以是整形常量或整形表达式

2.4 一维数组的遍历

遍历:将数组中的每个元素分别取出来就是遍历。for循环与数组的遍历是绝配

2.5 数组元素的默认值

数组是引用类型 ,当使用动态初始化方式创建数组时 ,元素只有默认值

代码语言:javascript复制
public class ArrayTest6 {
	public static void main(String argv[]){
		int a[]= new int[5]; 
		System.out.println(a[3]); //a[3]的默认值为0
	}
} 

3. 一维数组内存分析

3.1 Java虚拟机的内存划分

为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

区域名称

作用

​虚拟机栈​

用于存储正在执行的每个Java方法的局部变量表等。局部变量表存放了编译期可知长度的各种基本数据类型、对象引用,方法执行完,自动释放。

​堆内存​

存储对象(包括数组对象),new来创建的,都存储在堆内存。

​方法区​

存储已被虚拟机加载的类信息、常量、(静态变量)、即时编译器编译后的代码等数据。

本地方法栈

当程序中调用了native的本地方法时,本地方法执行期间的内存区域

程序计数器

程序计数器是CPU中的寄存器,它包含每一个线程下一条要执行的指令的地址

4. 多维数组的使用

声明与初始化

二位数组声明的语法格式:

代码语言:javascript复制
//推荐
元素的数据类型[][] 二维数组的名称;

//不推荐
元素的数据类型  二维数组名[][];
//不推荐
元素的数据类型[]  二维数组名[];

静态初始化

  • 格式:int[ ] [ ] arr = new int [ ] [ ] {3 , 8 , 2} , {2 , 7} , {9 , 0 , 1 , 6};
  • 解释: 定义一个名称为arr的二维数组,二维数组中有三个一维数组
    • 每一个一维数组中具体元素也都已初始化
      • 第一个一维数组 arr[0] = {3,8,2};
      • 第二个一维数组 arr[1] = {2,7};
      • 第三个一维数组 arr[2] = {9,0,1,6};
    • 第三个一维数组的长度表示方式:arr[2].length;
    • 注意特殊写法情况 , int[ ] x , y[ ] ; x 是一维数组 ,y 是二维数组

动态初始化:

格式1 : 规则二维表 ,每一行的列数是想同的

代码语言:javascript复制
//(1)确定行数和列数
元素的数据类型[][] 二维数组名 = new 元素的数据类型[m][n];
	//其中,m:表示这个二维数组有多少个一维数组。或者说一共二维表有几行
	//其中,n:表示每一个一维数组的元素有多少个。或者说每一行共有一个单元格

//此时创建完数组,行数、列数确定,而且元素也都有默认值

//(2)再为元素赋新值
二维数组名[行下标][列下标] = 值;

格式2 :不规则 ,每一行的列数不一样

0 人点赞