黑马程序员全套Java教程_Java基础教程_数组(十)

本文详细介绍了Java中的数组,包括数组的定义格式、动态和静态初始化、数组元素访问、内存分配以及数组操作中的常见问题。讲解了二维数组的遍历方法,解析了数组在内存中的栈和堆区域的使用,并提供了数组相关操作的实例,如遍历、获取元素数量和最值。同时,文章通过面试题的形式强调了数组定义的注意事项,例如不正确的数组定义示例。
摘要由CSDN通过智能技术生成

1、数组定义格式

1.1 数组概述

  • 一次性声明大量的用于存储数据的变量。
  • 要存储的数据通常都是同类型数据,如考试成绩。
  • 数组的定义:数组(array)是一种用于存储多个相同类型数据的存储模型。

1.2 数组的定义格式

  • 格式1(比较推荐):数据类型[] 变量名,如int[] arr。
    读作:定义了一个int类型的数组,数组名是arr。
  • 格式2:数据类型 变量名[],如int arr[]。
    读作:定义了一个int类型的变量,变量名是arr数组。

1.3 二维数组的遍历

    public static void main(String[] args) {
        //方法1
        int [] intA[] = {{1,2},{1,2,3},{1,2,3,4}};
        for (int i=0;i<intA.length;i++){
            for (int j=0;j<intA[i].length;j++){
                System.out.print(intA[i][j]+"\t");
            }
            System.out.println();
        }

        //方法2
        for (int[] arr : intA){
            for (int i : arr){
                System.out.print(i+"\t");
            }
            System.out.println();
        }
    }

面试题:以下数组定义中不正确的是

  • (A)int a[2][3]; (B)int b[][3]={0,1,2,3}; (C)int c[100][100] = {0}; (D)int d[3][]={{1,2},{1,2,3},{1,2,3,4}};
  • D。一维数组的定义方式为类型说明符数组名[常量表达式]。C语言中多维数组赋初值时可以部分赋值,也可以不指定除第一维以外的其他维的大小,故选项C正确。另外,如果对全部数组元素都赋初值,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省,所以选项B正确,而选项D是错误的。

2、数组初始化之动态初始化

2.1 数组初始化概述

  • Java中的数组必须显初始化,然后才能使用。
  • 初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值。

2.2 数组初始化方式

  • 分动态初始化和静态初始化。

2.3 动态初始化

  • 动态初始化:初始化时只指定数组长度,由系统为数组分配初始值。
  • 数组在初始化时,会为存储空间添加默认值。整数默认值为0,浮点数默认值为0.0,布尔值默认为false,字符默认为空字符,引用数据类型默认为null。
  • 格式:数据类型[] 变量名 = new 数据类型[数组长度]。如int[] arr = new int[3];
  • new的作用:为数组申请内存空间。

3、数组元素访问

  • 数组变量访问方式,格式:数组名。数组名的值为数组在内存空间首地址的值。
  • 数组内部保存的数据的访问方式,格式:数组名[索引]。
  • 索引是数组中数据的编号方式。
  • 作用:索引用于访问数组中的数据使用,数组名[索引]等同于变量名,是一种特殊的变量名。
  • 特征:索引从0开始;索引是连续的;索引逐一增加,每次加1。

4、内存分配

  • Java程序在运行时,需要在内存中分配空间,为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。
  • 内存分配范例:
int[] arr = new int[3];

在这里插入图片描述
左边int[] arr会在内存中给一个区域专门用于存储数组名arr。右边new的动作也会有一个内存空间用于存储,只不过new的动作是用于开辟可以存储三个元素的内存空间,为了方便我们标注索引0、1、2,数组出初始化给默认值0。内存空间首地址用于标识数组名,将arr指向内存空间的首地址。 当访问数据数据时,根据索引从开头一个个找,找到对应数据。

  • 左边的内存空间叫栈内存,存储局部变量。局部变量是定义在方法中的变量,如arr,使用完毕,立即消失。
  • 右边的叫堆内存,存储new出来的内容(对象)。数组在初始化时,会为存储空间添加默认值,每一个new出来的东西都有一个地址值,使用完毕,会在垃圾回收器空闲时被回收。

面试题:解释内存中的栈(stack)、堆(heap)和静态存储区的使用场景

  • (1)栈(内存):定义基本数据类型的变量、引用一个对象、函数调用的现场保存;
    (2)堆:通过new关键字和构造器创建对象;
    (3)静态存储区:字面量(literal)如直接书写100、“hello”和常量的存放。
    栈空间操作最快但也很小,通常大量的对象都是存放在堆空间,整个内存包括硬盘上的虚拟内存都可以被当成堆空间来使用。
String str = new String("hello");

上面的语句中str存放在栈上,用new创建出来的字符串对象放在堆上,而“hello”这个字面量存放在静态存储区。
补充:较新版本的Java中使用了一项叫“逃逸分析”的技术,可以将一些局部对象放在栈上以提升对象的操作性能。

5、数组初始化之静态初始化

  • 静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度(我们不可以指定)。
  • 格式:数据类型[] 变量名 = new 数据类型[] {数据1,数据2,数据3……};
    如int[] arr = new int[] {1,2,3};
  • 简化格式(推荐):数据类型[] 变量名 = {数据1,数据2,数据3……};
    如int[] arr = {1,2,3};

6、数组操作的两个常见小问题

  • 索引越界(ArrayIndexOutOfBoundsException):访问了数组中不存在的索引对应的元素,造成越界问题。
  • 空指针异常(NullPointerException):访问的数组已经不再指向堆内存的数据,造成空指针异常。
  • null:空值,引用数据类型的默认值,表示不指向任何有效空间。

7、数组相关常见操作

7.1 遍历

  • 使用循环遍历

7.2 获取数组元素数量

  • 格式:数组名==.length==,如arr.length。
  • 数组遍历通用格式:
int[] arr = {……};

for(int i=0; i<arr.length; i++){
	sout(arr[i]);
}

7.3 获取最值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值