本文最后更新于:2020年6月18日 下午

数组的定义

​ 数组(array)是一种最简单的复合数据类型,它是有序数据的集合,数组中的每个元素具有相同的数据类型,可以用一个统一的数组名和不同的下标来确定数组中唯一的元素。根据数组的维度,可以将其分为一维数组、二维数组和多维数组等。

在计算机语言中数组是非常重要的集合类型,大部分计算机语言中数组具有如下三个基本特性:

  1. 一致性:数组只能保存相同数据类型元素,元素的数据类型可以是任何相同的数据类型。
  2. 有序性:数组中的元素是有序的,通过下标访问。
  3. 不可变性:数组一旦初始化,则长度(数组中元素的个数)不可变。

总的来说,数组具有以下特点:

  • 数组可以是一维数组、二维数组或多维数组。
  • 数值数组元素的默认值为 0,而引用元素的默认值为 null。
  • 数组的索引从 0 开始,如果数组有 n 个元素,那么数组的索引是从 0 到(n-1)。
  • 数组元素可以是任何类型,包括数组类型。
  • 数组类型是从抽象基类 Array 派生的引用类型。

在 Java 中数组的下标是从零开始的,很多计算机语言的数组下标也从零开始。Java 数组下标访问运算符是中括号,如 intArray[0],表示访问 intArray 数组的第一个元素,0 是第一个元素的下标。Java 中的数组本身是引用数据类型,它的长度属性是 length。


数组的初始化

Java 一维数组有两种初始化方法

静态初始化

int array[] = new int[]{1,2,3,4,5}
//或者
int array[] = {1,2,3,4,5}

需要注意的是,写成如下形式是错误的

int array[] = new int[5]{1,2,3,4,5}

动态初始化

int array[] = new int[5];
array[0] = 1;
array[1] = 2;
array[2] = 3;
array[3] = 4;
array[4] = 5;

静态与动态初始化的区别就在于,前者是声明的时候就初始化,后者是先声明,再动态初始化。


数组元素访问

数组元素访问

数组变量访问方式
格式: 数组名

数组内部保存的数据的访问方式
格式:数组名[索引]

索引是数组中数据的编号方式
作用:索引用于访问数组中的数据使用,数组名索引]等同于效名,是一种特殊的变量铭

特征①:索引从0开始
特征②:索引是连续的
特征③:索引逐一增加,每次加1

package ArrayDemo;

/*
数组:是一种用于存储多个相同类型数据的存储模型

定义格式: (推荐方式)
        数据类型[]数组名;
        举例: int[] arr;
        数组初始化:
        A:所谓初始化:就是为数组中的数组元素分配内存空间,并为每个数组元素赋值
        B:数组初始化
        动态初始化
        静态初始化
        动态初始化:
        初始化时只指定数组长度,由系统为数组分配初始值
        格式:数据类型[]变量名= new 数据类型[数组长度];
        范例: int[] arr = new int[3];
        */

public class array01 {
    public static void main(String[] args) {
        int[]arr = new int[3];
        /*
左边:
int :说明数组中的元素类型是int类型
[]:说明这是一个数组
arr:这是数组的名称
右边:
new:为数组申请内存空间
int:说明数组中的元素类型是int类型
[]:说明这是一一个数组
3:数组长度,其实就是数组中的元素个数
*/

        //输出数组名
        System.out.println(arr);
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);
    }
}

内存分配

java中的内存分配

栈内存:存储局部变量
定义在方法中的变量,使用完毕,立即消失
堆内存:存储new出来的内容(实体,对象)
数组在初始化时,会为存储空间添加默认值
整数: 0
浮点数: 0.0
布尔: false
字符:空字符
引用数据类型: null
每一个new出来的东西都有一个地址值,使用完毕,会在垃圾回收器空闲时被回收。

数组内存图(单个数组)

 public class Demo04 {
    public static void main(String[] args) {
        int[] arr = new int[3];
        System.out.println(arr); // [I@50cbc42f
        arr[1] = 2;
        System.out.println(arr[1]);
    }
}

以上方法执行,输出的结果是[I@5f150435,这个是什么?

​ 是数组在内存中的地址。new出来的内容,都是在堆内存中存储的,而方法中的变量arr保存的是数组的地址。 输出arr[0],就会输出arr保存的内存地址中数组中0索引上的元素

数组内存图(多个数组)

 public static void main(String[] args) {
    int[] arr1 = new int[2];
    int[] arr2 = new int[3];
    System.out.println(arr1);
    System.out.println(arr1[0]);
    System.out.println(arr1[1]);
    System.out.println(arr2);
    System.out.println(arr2[0]);
    System.out.println(arr2[1]);
    System.out.println(arr2[2]);
    // 给arr1数组的索引为0元素赋值100      
    arr1[0] = 100;
    // 给arr2数组的索引为0元素赋值200      
    arr2[0] = 200;
    System.out.println("‐‐‐‐‐‐‐‐‐‐‐");
    System.out.println(arr1);
    System.out.println(arr1[0]);
    System.out.println(arr1[1]);
    System.out.println(arr2);
    System.out.println(arr2[0]);
    System.out.println(arr2[1]);
    System.out.println(arr2[2]);
}

数组初始化之静态初始化

静态初始化:初始化时指定每个数组元素的初始值,由系统决定数组长度
格式:数据类型[]变量名= new数据类型[]{数据1,数据2,数据3,…..

范例:int[] arr=new int[]{1,2,3};

简化格式:数据类型[]变量名={数据1,数据2,数据3,·····}

范例: int[] arr={1,2,3};

package ArrayDemo;

public class array02 {
    public static void main(String[] args) {
        //定义数组
        int[] arr = {1, 2, 3};

        //输出数组名
        System.out.println(arr);

        //输出数组中的元素
        System.out.println(arr[0]);
        System.out.println(arr[1]);
        System.out.println(arr[2]);

    }
}

输出:

[I@1b6d3586
1
2
3

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

索引越界:访问了数组中不存在的索|对应的元素,造成索引越界问题

空指针异常:访问的数组已经不再指向堆内存的数据,造成空指针异常

null:空值,引用数据类型的默认值,表示不指向任何有效对象

package ArrayDemo;
        /*
        索引越界:访问了数组中不存在的索引对应的元素,造成索引越界问题
        ArrayIndexOutOfBoundsException

        空指针异常:访问的数组已经不再指向堆内存的数据,造成空指针异常
        NullPointerException

        null:空值,引用数据类型的默认值,表示不指向任何有效对象
        */


public class array03 {
    public static void main(String[] args) {
        int[] arr = new int[3] ;

        //索引越界
        //System.out.println(arr[3]);
        //Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3

        //空指针异常
        //把null赋值给数组
        arr = null;
        System.out.println(arr[0]);
        //Exception in thread "main" java.lang.NullPointerException
        
    }
}

数组常见操作

遍历

获取数组元素数量

格式:数组名length
范例: arr.length

遍历通用格式:

int[] arr = {.....}

for(int x=0; x<arr.length;x++){
	arr[x]	//对arr[x]进行操作
}

案例:

package ArrayDemo;

/*
遍历
获取数组中的每一个元素输出在控制台
获取数组元素
数组名. length
*/

public class array04 {
    public static void main(String[] args) {
        //定义数组
        int[] arr = {1,23,4545,678768,32423,23445};

        //使用通用的遍历格式
        for(int x=0; x<arr.length; x++){
            System.out.println(arr[x]);
        }
    }
}

获取最值

int[] arr = {12,45,98,73,60};

思路:
1:定义-个变量,用于保存最大值(或最小值)

int max;

2:取数组中第一个数据作为变 量的初始值

int max = arr[0];

3:与数组中剩余的数据逐个比对,每次比对将最大值保存到(max)变量中

for(int x=1; x<arr .length;X++) {
}

4:循环结束后打印变量的值

System.out . println("max: "+max);

案例:

package ArrayDemo;

/*
获取最值
获取数组中的最大值
最小值同道理
*/

public class array05 {
    public static void main(String[] args) {
        //定义数组
        int[]arr = {12,23,453,678,4324};

        //定义一个变量,用于保存最大值
        //取数组中第一一个数据作为变量的初始值
        int max = arr[0];

        //与数组 中剩余的数据逐个比对,每次比对将最大值保存到变量中
        for(int x=1;x<arr.length;x++){
            if(arr[x]>max){
                max =arr[x];
            }
        }

        //循环结束后打印变量的值
        System.out.println("max:"+ max);

    }
}

输出:

max:4324

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

端午安康! 上一篇
学习网站分享 下一篇