嵌套循环,数组的声明和初始化方式,数组的下标含义(六)

436 阅读5分钟

嵌套循环

形式:在for,while,do...while的循环体语句中,还有另一个循环(for,while,do...while) 运行口诀:外循环循环一次,内循环循环一轮

数组的声明与初始化

数组的声明:

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

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

方式一:静态初始化

  • 格式:
数据类型[] 数组名 = {元素1,元素2,元素3...};//必须在一个语句中完成,不能分开两个语句写
  • 举例:

定义存储1,2,3,4,5整数的数组容器

int[] arr = {1,2,3,4,5};//正确

int[] arr;
arr = {1,2,3,4,5};//错误

方式二:静态初始化

  • 格式:
数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...};
或
数据类型[] 数组名;
数组名 = new 数据类型[]{元素1,元素2,元素3...};
  • 举例:

定义存储1,2,3,4,5整数的数组容器。

int[] arr = new int[]{1,2,3,4,5};//正确

int[] arr;
arr = new int[]{1,2,3,4,5};//正确

int[] arr = new int[5]{1,2,3,4,5};//错误的,后面有{}指定元素列表,就不需要在[长度]指定长度。

方式三:动态初始化

  • 格式:
 数组存储的元素的数据类型[] 数组名字 = new 数组存储的元素的数据类型[长度];

  或

 数组存储的数据类型[] 数组名字;
 数组名字 = new 数组存储的数据类型[长度];
  • 数组定义格式详解:
    • 数组存储的元素的数据类型: 创建的数组容器可以存储什么数据类型的数据。
    • 元素的类型可以是任意的Java的数据类型。例如:int, String, Student等
    • [] : 表示数组。
    • 数组名字:为定义的数组起个变量名,满足标识符规范,可以使用名字操作数组。
    • new:关键字,创建数组使用的关键字。因为数组本身是引用数据类型,所以要用new创建数组对象。
    • [长度]:数组的长度,表示数组容器中可以存储多少个元素。
    • 注意:数组有定长特性,长度一旦指定,不可更改。

数组的遍历

  • 数组的长度属性: 每个数组都具有长度,而且是固定的,Java中赋予了数组的一个属性,可以获取到数组的长度,语句为:数组名.length ,属性length的执行结果是数组的长度,int类型结果。由次可以推断出,数组的最大索引值为数组名.length-1
  • 数组遍历: 就是将数组中的每个元素分别获取出来,就是遍历。遍历也是数组操作中的基石。
public static void main(String[] args) {
  	int[] arr = new int[]{1,2,3,4,5};
  	//打印数组的属性,输出结果是5
  	System.out.println("数组的长度:" + arr.length);
    
    //遍历输出数组中的元素
    System.out.println("数组的元素有:");
    for(int i=0; i<arr.length; i++){
        System.out.println(arr[i]);
    }
}

idea中快捷键itar可以快速生成遍历循环

数组的内存分析

Java程序是在JVM中运行的。

JVM把内存分为几个部分:

  • Java方法栈:用来存储方法中的局部变量,例如main方法的局部变量
  • 堆(用来存储new出来的对象)
  • 本地方法栈,他是Java调用C语言的代码时需要使用的内存
  • 方法区,用来加载存储的类、静态数据、常量等
  • 程序计数器,用来记录每一个线程的下一条指令

数组的元素时存储在一块连续的空间中,每一个元素是相邻的

一维数组的内存分析.png

数组元素的数据类型,决定了每一个元素占的内存大小

例如:int类型是4个字节

JVM会给每一个字节的内存都进行编号,数组的内存空间是连续的,因此只要记录第一个元素的第一个字节的内存的地址即可

由于Java运行在JVM上,所以实际上我们是无法获得真正的地址的。

数组名这个变量中,存储的就是所有数组元素的首地址。

我们直接打印数组名显示的结果类似于:[I@4554617c

我们可以将它砍成是内存地址,但本质上不是。

因为Java是不对外暴漏内存地址的。这个东西它代表的是:

[:表示以为数组,如果是[[:表示二维数组

I:表示元素是int类型

@:是一个连接符

4554617c:是数组对象HashCode值,前面这个HashCode不用关心,后面如果需要把对象放到散列数据结构(hashtable)中去,4554647c可以比喻成对象的身份证号。

public class Exam1 {
 public static void main(String[] args) {
     int[] arr = new int[5];
     System.out.println(arr[4]);
 }
}
//它的运行结果是
//0

下标

如果要访问某个元素,需要通过数组名[下标] 的格式。

数组名:获取首地址

[下标]:这个元素,距离首地址间隔几个元素,单元格

第一个元素,距离首地址间隔0个元素/单元格

第二个元素,距离收低值间隔1个元素/单元格

public static void main(String[] args){
    int a = 1;//这个a是局部变量,存储在“栈”中
    int[] arr = new int[5];//new出来的部分存储在“堆”中,arr也是局部变量,存储在“栈”中
    System.out.println("----------");
    int arr1 = {1,2,3,4,5};
    System.out.println(arr1);//[I@4554617c
    System.out.println("----------");
    int[] arr2 = new int[5];
    
}

因为数组可以通过[下标]直接访问到某个元素,因此它的访问效率是很高的

new这个关键字的意思是:申请一块内存空间。

​ 所以,数组在初始化时,必须指定元素的类型和长度。只有知道了元素类型和长度,JVM才能知道需要给你分配多大的空间。