Java数组

一、数组

1.1 数组的概述

  • 数组(Array),是多个相同类型数据一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
  • 数组本身是引用数据类型,而数组中的元素可以是任何数据类型,包括基本数据类型和引用数据类型。
  • 创建数组对象会在内存中开辟一整块连续的空间,而数组名中引用的是这块连续空间的首地址。
  • 数组的长度一旦确定,就不能修改。
  • 我们可以直接通过下标(或索引)的方式调用指定位置的元素,速度很快。
  • 数组的分类:
    • 按照维度:一维数组、二维数组、三维数组、…
    • 按照元素的数据类型分:基本数据类型元素的数组、引用数据类型元素的数组(即对象数组)

1.2 一维数组

  • 一维数组的声明方式:type var[] 或 type[] var;

  • Java语言中声明数组时不能指定其长度(数组中元素的数), 例如: int a[5]; //非法

  • 初始化

    • 动态初始化:数组声明且为数组元素分配空间与赋值的操作分开进行。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int[] arr = new int[3];
    arr[0] = 3;
    arr[1] = 9;
    arr[2] = 8;

    String names[];
    names = new String[3];
    names[0] = “钱学森”;
    names[1] = “邓稼先”;
    names[2] = “袁隆平”;
    • 静态初始化:在定义数组的同时就为数组元素分配空间并赋值。
    1
    2
    3
    int arr[] = new int[]{ 3, 9, 8};

    int[] arr = {3,9,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
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    public class ArrayTest {

    public static void main(String[] args) {
    int[] ids;//声明
    //静态初始化:数组的初始化和数组元素的赋值操作同时进行
    ids = new int[]{1001,1002,1003,1004};
    //动态初始化:数组的初始化和数组元素的赋值操作分开进行
    String[] names = new String[5];

    //错误的写法:
    //int[] arr1 = new int[];
    //int[5] arr2 = new int[5];
    //int[] arr3 = new int[3]{1,2,3};

    //也是正确的写法:
    int[] arr4 = {1,2,3,4,5};//类型推断

    //总结:数组一旦初始化完成,其长度就确定了。

    //如何调用数组的指定位置的元素:通过角标的方式调用。
    //数组的角标(或索引)从0开始的,到数组的长度-1结束。
    names[0] = "王铭";
    names[1] = "王赫";
    names[2] = "张学良";
    names[3] = "孙居龙";
    names[4] = "王宏志";

    //如何获取数组的长度。
    //属性:length
    System.out.println(names.length);//5
    System.out.println(ids.length);

    //如何遍历数组
    for(int i = 0;i < names.length;i++){
    System.out.println(names[i]);
    }
    }
    }
  • 数组是引用类型,它的元素相当于类的成员变量,因此数组一经分配空间,其中的每个元素也被按照成员变量同样的方式被隐式初始化。

    • 对于基本数据类型而言,默认初始化值各有不同。
    • 对于引用数据类型而言,默认初始化值为null(注意与0不同!)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
public class ArrayTest1 {

public static void main(String[] args) {
//数组元素的默认初始化值
int[] arr = new int[4];
for(int i = 0;i < arr.length;i++){
System.out.println(arr[i]);//0
}
System.out.println("**********");

short[] arr1 = new short[4];
for(int i = 0;i < arr1.length;i++){
System.out.println(arr1[i]);//0
}
System.out.println("**********");
float[] arr2 = new float[5];
for(int i = 0;i < arr2.length;i++){
System.out.println(arr2[i]);//0.0
}

System.out.println("**********");
char[] arr3 = new char[4];
for(int i = 0;i < arr3.length;i++){
System.out.println("----" + arr3[i] + "----");//---- ----
}

if(arr3[0] == 0){
System.out.println("你好!");//成功打印
}

System.out.println("**********");
boolean[] arr4 = new boolean[5];
System.out.println(arr4[0]);//false

System.out.println("**********");
String[] arr5 = new String[5];
System.out.println(arr5[0]);//null
if(arr5[0] == null){
System.out.println("北京天气不错!");//成功打印
}
}
}
  • 一维数组内存解析

1.3 多维数组

  • Java 语言里提供了支持多维数组的语法。
  • 如果说可以把一维数组当成几何中的线性图形,那么二维数组就相当于是一个表格,像右图Excel
    中的表格一样。
  • 对于二维数组的理解,我们可以看成是一维数组array1又作为另一个一维数组array2的元素而存
    在。其实,从数组底层的运行机制来看,其实没有多维数组。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public class ArrayTest {
public static void main(String[] args) {
//1.二维数组的声明和初始化
int[] arr = new int[]{1,2,3};//一维数组
//静态初始化
int[][] arr1 = new int[][]{{1,2,3},{4,5},{6,7,8}};
//动态初始化1
String[][] arr2 = new String[3][2];
//动态初始化2
String[][] arr3 = new String[3][];
//错误的情况
// String[][] arr4 = new String[][4];
// String[4][3] arr5 = new String[][];
// int[][] arr6 = new int[4][3]{{1,2,3},{4,5},{6,7,8}};

//也是正确的写法:
int[] arr4[] = new int[][]{{1,2,3},{4,5,9,10},{6,7,8}};
int[] arr5[] = {{1,2,3},{4,5},{6,7,8}};

//2.如何调用数组的指定位置的元素
System.out.println(arr1[0][1]);//2
System.out.println(arr2[1][1]);//null

arr3[1] = new String[4];
System.out.println(arr3[1][0]);

//3.获取数组的长度
System.out.println(arr4.length);//3
System.out.println(arr4[0].length);//3
System.out.println(arr4[1].length);//4

//4.如何遍历二维数组
for(int i = 0;i < arr4.length;i++){
for(int j = 0;j < arr4[i].length;j++){
System.out.print(arr4[i][j] + " ");
}
System.out.println();
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class ArrayTest {
public static void main(String[] args) {
int[][] arr = new int[4][3];
System.out.println(arr[0]);//[I@74a14482
System.out.println(arr[0][0]);//0

System.out.println(arr);//[[I@1540e19d

System.out.println("*****************");
float[][] arr1 = new float[4][3];
System.out.println(arr1[0]);//[F@1540e19d
System.out.println(arr1[0][0]);//0.0

System.out.println("*****************");

String[][] arr2 = new String[4][2];
System.out.println(arr2[1]);//[Ljava.lang.String;@677327b6
System.out.println(arr2[1][1]);//null

System.out.println("*****************");
double[][] arr3 = new double[4][];
System.out.println(arr3[1]);//null
//System.out.println(arr3[1][0]);//报错空指针异常
}
}
  • 二维数组内存解析

1.4 Arrays工具类的使用

  • java.util.Arrays类即为操作数组的工具类,包含了用来操作数组(比如排序和搜索)的各种方法。

1.5 数组使用中的常见异常