第3章 数组

文章目录

  • 定义

    • 概述
    • 分类
  • 一维数组

  • 一维数组声明 * 一维数组初始化 * 一维数组使用

    1 * 多维数组 2
  • 多维数组声明 * 多维数组初始化 * 多维数组使用

    • 数组例题
    • Arrays工具类
    • 数组使用常见异常
  • 数组脚标越界异常(ArrayIndexOutOfBoundsException) * 空指针异常(NullPointerException)

定义

  • 数组(Array),是多个相同类型数据一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。

  • 常见概念

  • 数组名

    • 下标(或索引)
    • 元素
    • 数组的长度

概述

  • 数组本身是

引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。

  • 创建数组对象会在内存中

开辟一整块连续的空间,而数组名中引用的是这块连续空间的 首地址。

  • 数组的长度一旦确定,就

不能修改。

  • 可以直接通过==下标(或索引)==的方式调用指定位置的元素,速度很快。

分类

按照维度:可以分为一维数组、多维数组。

一维数组

一维数组声明

Java中声明数组时不能指定其长度,如 int a[5]; 是非法的。

1// 两种格式 2type var[]; 3type[] var2; 4 5//举例 6int a[]; 7int[] a1; 8double b[]; 9//引用类型变量数组 10String[] c; 11 12

一维数组初始化

  • 动态初始化

  • 数组声明且为数组元素分配空间与赋值的操作分开进行

1// 声明 2int[] arr = new int[3]; 3// 初始化 4arr[0] = 3; 5arr[1] = 9; 6arr[2] = 8; 7 8// 声明 9String names[]; 10// 初始化 11names = new String[3]; 12names[0] = “钱学森”; 13names[1] = “邓稼先”; 14names[2] = “袁隆平”; 15 16
  • 静态初始化

  • 在定义数组的同时就为数组元素分配空间并赋值。

1int arr[] = new int[]{3,9,8}; 2int[] brr = {3,9,8}; 3 4String names[] = { 5 "李四光","茅以升","华罗庚" 6} 7 8

一维数组使用

  • 数组元素的引用

  • 定义数组并new为其分配空间后,才可以引用数组中的元素。

    • 引用方式:

数组名[数组元素下标] * 数组元素下标可以是整型常量或整型表达式。

  • 如a[3] , b[i] , c[6*i];

    • 数组元素

下标从0开始;长度为n的数组合法下标取值范围: 0 —>n-1。

  • 如int a[]=new int[3]; * 可引用的数组元素为 a[0]、a[1]、a[2]

    • 每个数组都有一个属性length指明它的长度。
  • 如:

a.length 指明数组a的长度(元素个数)

1* 数组一旦初始化,其长度是不可变的。 2
  • 默认初始化值

  • 数组是引用类型,它的元素相当于类的成员变量,因此数组一经分配空间,其中的每个元素也被按照成员变量同样的方式被隐式初始化

1public class Test { 2 public static void main(String argv[]){ 3 int a[]= new int[5]; 4 System.out.println(a[3]); //a[3]的默认值为0 5 6 char a[] = new char[3]; 7 System.out.println("---" + a[0] + "***"); //--- *** 8 System.out.print(0 == a[0]); //true 9 } 10} 11 12
  • 内存解析

JVM内存结构图如下

image-20200322154208071

1int arr[] = new int[]{1,2,3}; 2int arr2[] = arr; 3 4
  1. 首先在栈内存中创建arr局部变量
  2. 在堆内存中开辟一个连续空间,共3块,首地址假设为0x34ab。
  3. 栈内存中的arr存值设为0x34ab,即指向堆内存中开辟空间的首地址,此时默认值均为0。
  4. 分别给堆内存中arr[0],arr[1],arr[2] 赋值为1,2,3。
  5. 将数组arr的值即

堆内存数据的首地址0x34ab赋值给arr2,两个堆内存中的变量均指向堆内存中同一个地址,这种方式不是数组的复制。

image-20200322155443820

多维数组

对于二维数组,可以看成是一维数组array1作为另一个一维数组array2的元素而存在。从数组底层的运行机制来看,其实没有多维数组。

多维数组声明

1// 两种格式 2type var[][]; 3type[][] var2; 4 5//举例 6int a[][]; 7int[][] a1; 8double b[][]; 9//引用类型变量数组 10String[][] c; 11 12

多维数组初始化

当使用new 来创建多维数组时,不必指定每一维的大小,但 要指定最左边的维的大小。

  • 动态初始化

1/* 2 * 格式一 3 * 定义了名称为arr的二维数组,二维数组中有3个一维数组 4 * 每个一维数组中有2个元素 5 * 一维数组的名称分别为arr[0], arr[1], arr[2] 6 */ 7int[][] arr = new int[3][2]; 8arr[0][1] = 78; 9 10/* 11 * 格式二 12 * 定义了名称为arr的二维数组,二维数组中有3个一维数组 13 * 每个一维数组都是默认初始化值null (注意:区别于格式1) 14 */ 15int[][] arr = new int[3][]; 16arr[0] = new int[3]; 17arr[1] = new int[1]; 18arr[2] = new int[2]; 19 20//非法 21int[][]arr = new int[][3]; 22 23
  • 静态初始化

1/* 2 * 定义一个名称为arr的二维数组,二维数组中有三个一维数组 3 * 每个一维数组中具体元素也都已初始化 4 * 5 * 第一个一维数组 arr[0] = {3,8,2}; 6 * 第二个一维数组 arr[1] = {2,7}; 7 * 第三个一维数组 arr[2] = {9,0,1,6}; 8 * 9 * 第三个一维数组的长度表示方式:arr[2].length; 10 */ 11int[][] arr = new int{ 12 {3,8,2}, 13 {2,7}, 14 {9,0,1,6} 15}; 16 17int arr1[][] = { 18 {3,8,2}, 19 {2,7}, 20 {9,0,1,6} 21}; 22 23
  • 注意

  • 特殊写法情况:int[] x,y[]; x是一维数组,y是二维数组。

    • Java中多维数组不必都是规则矩阵形式

多维数组使用

多维数组的数组名如arr,直接输出是第一个维度数组的首地址,arr.length是第一个维度数组的长度。

1int[][] arr = new int [4][]; 2System.out.println(arr); // [[I@15db9742 3arr[0] = new int[3]; 4System.out.println(arr[0]); // [I@6d06d69c 5System.out.println(arr[1]); // null 6System.out.println(arr[0][0]); // 0 7 8System.out.println(arr.length); // 4 9System.out.println(arr[0].length); // 3 10 11

数组例题

Arrays工具类

定义在java.util包下,提供了很多操作数组的方法。

boolean equals(int[] a,int[] b) 判断两个数组是否相等。 String toString(int[] a) 输出数组信息。 void fill(int[] a,int val) 将指定值填充到数组之中 void sort(int[] a) 对数组进行排序。 int binarySearch(int[] a,int key) 对排序后的数组进行二分法检索指定的值。

1import java.util.Arrays; 2/* 3 * java.util.Arrays:操作数组的工具类,里面定义了很多操作数组的方法 4 */ 5public class ArraysTest { 6 public static void main(String[] args) { 7 8 //1.boolean equals(int[] a,int[] b):判断两个数组是否相等。 9 int[] arr1 = new int[]{1,2,3,4}; 10 int[] arr2 = new int[]{1,3,2,4}; 11 boolean isEquals = Arrays.equals(arr1, arr2); 12 System.out.println(isEquals); 13 14 //2.String toString(int[] a):输出数组信息。 15 System.out.println(Arrays.toString(arr1)); 16 17 18 //3.void fill(int[] a,int val):将指定值填充到数组之中。 19 Arrays.fill(arr1,10); 20 System.out.println(Arrays.toString(arr1)); 21 22 //4.void sort(int[] a):对数组进行排序。 23 Arrays.sort(arr2); 24 System.out.println(Arrays.toString(arr2)); 25 26 //5.int binarySearch(int[] a,int key) 27 int[] arr3 = new int[]{-98,-34,2,34,54,66,79,105,210,333}; 28 int index = Arrays.binarySearch(arr3, 210); 29 if(index >= 0){ 30 System.out.println(index); 31 }else{ 32 System.out.println("未找到"); 33 } 34 } 35} 36 37

数组使用常见异常

数组脚标越界异常(ArrayIndexOutOfBoundsException)

访问到了数组中的不存在的脚标时发生。

1int[] arr = new int[2]; 2System.out.println(arr[2]); 3System.out.println(arr[-1]); 4 5

空指针异常(NullPointerException)

arr引用没有指向实体,却在操作实体中的元素时。

1int[] arr = null; 2System.out.println(arr[0]); 3 4

代码交流 2021