Chapter05【数组】

第一章 数组的定义和访问

1.1 容器概述

  • 容器:是将多个数据存储到一起,每个数据称为该容器的元素。
  • 生活中的容器:水杯、衣柜、教室

1.2 数组的概念

  • 数组概念:是一种容器,可以同时存放多个数据。
  • 特点:
    • 数组是一种引用数据类型
    • 数组当中的多个数据,类型必须统一
    • 数组的长度在程序的运行期间不可改变
  • 初始化:在内存当中创建一个数组,并且向其中赋予一些默认值。
  • 两种常见的初始化方式:
    • 动态初始化(指定长度):在创建数组的时候,直接指定数组当中的多个元素。
    • 静态初始化(指定内容):在初始话的时候,不直接指定数据多少个,而是直接将数据的内容进行指定。

1.3 数组的定义

1. 动态初始化

  • 动态初始化数组的格式:

    数据类型【】 数组名称 = new 数据类型【数组长度】;

  • 解析含义:

    左侧数据类型:也就是数组当中保存的数据,全都是统一的数据类型。

    左侧的中括号:代表我是一个数组。

    左侧数组名称:给数组取一个名字

    右侧的new:代表创建数组的动作

    右侧的数据类型:必须和左侧的数据类型保持一致。

    右侧中括号的长度:也就是数组当中可以存多好个数据,是一个int数字。

    int[] arr = new int[3];
    

2.静态初始化

  • 基本格式:

    数据类型 数组名称 = new 数据类型[]{元素1,元素2,.....};

  • 注意事项:

    虽然静态初始化没有直接告诉长度,但是根据大括号里面的元素具体内容,也可以自动推算出长度。

    int[] arr = new int[]{元素1、元素2、元素3、、、};
    

3.静态初始化省略格式

  • 使用静态初始化数组的时候,格式可以省略

    静态初始化标准格式:

    数据类型【】 数组名称 = new 数据类型【】{元素1,元素2,。。。。}

    省略格式:

    数据类型【】 数组名称 = {元素1,元素2、、}

    int[] arr = {元素1、元素2、、、};
    
  • 注意事项:

  1. 静态初始化没有直接指定长度,但是仍然会自动推算长度。
  2. 静态初始化的标准格式可以拆分为两个步骤。
  3. 动态初始化也可以拆分为两个步骤。
  4. 静态初始化一旦使用省略格式,就不能拆分为两个步骤。
  • 使用建议:

    如果不确定数组当中的具体内容,用动态初始化;否则,已经确定了具体内容,用静态初始化.

1.4 数组的访问

  • 索引:每一个存储到数组的元素,都会自动拥有一个编号,从0开始,自动编号称为索引值。

  • 格式:

    数组名【索引】;
    
  • 数组长度属性:每个数组都有长度,而且固定的,可以通过语句 数组名.length获取数组的长度。数组最大的索引值为length-1;

    public static void main(String[] args){
        int[] arr = new int[]{3,6,9,12,23};
        //打印数组长度
        System.out.println(arr.length)
    }
    
  • 访问数组中的元素

    • 数组名[索引] = 数值,为数组中的元素赋值。将会替换掉原来的数值。
    • 变量 = 数组名称 [索引],获取数组中的元素。

第二章 数组内存图

2.1 内存的概述

​ 内存是计算机中的重要原件,临时存储区域,作用是运行程序。 我们平时编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须存放进内存中才能运行,运行完毕后就会清空内存。

2.2 java虚拟机的内存划分

  1. 栈(Steck):存放的都是方法中的局部变量。方法的运行一定要在栈当中运行。

    局部变量:方法的参数,或者是方法{}内部的变量。

    作用域:一旦超出作用域,立刻从栈内存中消失。

  2. 堆(Heep):凡是new出来的东西,都在堆当中。

    堆内存当中的东西都有一个地址值:16进制,

    堆内存中的数据,都有默认值。规则:

    如果是整数 默认值为0

    如果是浮点数 默认值为0.0

    如果是字符 默认值为'u0000'

    如果是布尔 默认值为false

    如果是引用类型 默认值为null

  3. 方法区(Method Area):存储.class文件相关信息,包含方法的信息。

  4. 本地方法栈(Native Method Stack):与操作系统相关。

  5. 寄存器(Pc Register):与CPU相关。

2.3 数组在内存中的存储

1.一个数组的内存图

涉及知识点:

  1. 方法区:中存放.class相关文件,包含方法信息(主要就是方法信息),如Demo02ArrayOne的main方法
  2. 栈:运行main方法,加载到栈内存当中,并为main方法在栈当中开辟内存空间,这个动作叫做进入栈内存。(进栈)
  3. new出来的东西都在堆当中, 在堆里边开辟一段内存空间。十六进制开头0X表示
  4. 数组在内存空间有自己的内存地址,以十六进制表示。0X开头

其他:

十六进制开头0X表示

数组的名称其实就是一个局部变量

2.两个数组的内存图

3.两个变量执行同一个数组

第三章 数组的常见操作

3.1常见问题_数组索引越界

数组的索引编号从0开始,一直到”数组长度-1“为止。

如果访问数组的编号并不存在,就会发生数组索引越界异常

报错代码:ArrayIndexOutOfBoundsException

原因:索引编号写错了

解决:修改称为正确的索引即可。

3.2 空指针异常

所有引用类型变量都可以赋值为一个null值,但其代表为空。

数组值赋了一个null,没有进行new的创建,就会发生空指针异常。 NullPointerException

3.3 获取数组的长度

格式:数组名称.length

将会得到一个int类型的数字,代表数组的长度。

数组一旦创建,程序运行期间不可更改,长度不可改变。

3.4 数组的遍历

数组遍历:就是将数组中的每个元素分别获取出来。

public static void main(String[] args){
    int[] arr = new int[]{3,6,9};
    for(int i=0;i<=arr.length-1;i++){
    	System.out.println(arr[i]);
    }
}

3.5 获取数组的最大值

从数组的所有元素中找出最大值

public static void main(String[] args){
    int max = 0;
    int[] arr = new int[]{3,69,9,66,33};
   	for(int i = 0;i<=arr.length-1;i++){
        if(max<arr[i]){
            max = arr[i];
        }
    }
    System.out.println("最大值是:"+max);
}

3.6 数组反转

数组反转:数组中的元素颠倒顺序。

public static void main(String[] args){
    int[] arr = {1,2,3,5,6};
    /*循环中定义变量min = 0最小索引
    max = arr.length-1最大索引
    */
    for(int min = 0,max = arr.length-1;max>min;max--,min++){
        //利用第三方变量完成数组中的元素交换
        int temp = arr[min];
        arr[min] = arr[max];
        arr[max] = temp;
    }
    //反转后,遍历数组
    for(int i= 1;i<arr.length-1;i++){
        System.out.println(arr[i])
    }
}

第四章 数组作为方法参数和返回值类型

4.1 数组作为方法参数

  • 任何数据类型都可以作为方法参数。

  • 数组作为方法参数传递,传递的参数是数组内存的地址值。

    public static void mian(String[] args){
        int[] array  = {3,6,9};
        printArray(array);
    }
    /*
    三要素:
    返回值类型:只是进行打印而已,不需要进行其他操作,也没有结果,所以用void;
    方法名称:printArray
    参数列表:必须给数组,才能打印其中的元素,int[] array*/
    public static void printArray(int[] array){
        for(int i = 0;i<array.length;i++){
            System.out.print(array[i]);
        }
    }
    

4.2 数组作为方法返回值

数组作为方法的参数,传递进去的其实就是数组的地址值。

数组作为方法的返回值,返回的其实也是数组的地址值。

public static void mian(String[] args){
    //调用方法,接收数组的返回值
    //接收到的是数组的内存地址
    int[] arr = gerArray();
    for(int a=0;a<arr.length;a++){
        System.out.print(arr[i])
    }
}
public static int[] gerArray(){
    int[] arr = {3,6,9};
    //返回数组的地址,返回到调用者
    return arr;
}

方法的参数为基本数据类型时,传递的是数据值。方法的参数为引用数据类型时传递的是地址值。

原文地址:https://www.cnblogs.com/anke-z/p/12376895.html