春色三分,二分尘土,一分流水。

——苏轼《水龙吟》

[TOC]

Java数组

  • 数组是多个相同类型数据的组合,实现对这些数据的统一管理。

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

  • 数组属引用类型,数组型数据是对象(object),数组中的每个元素相当于该对象的成员变量。

1. 一维数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//一维数组的声明

//数组有定长特性,长度一旦指定,不可更改。
int arr[] = new int[3];
//动态初始化:数组声明且为数组元素分配空间与赋值的操作分开进行
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;


//静态初始化:在定义数组的同时就为数组元素分配空间并赋值。
int[] arr = new int[3]{1,2,3};

//静态初始化:简化(类型推断)
int[] arr = {1,2,3};

1.1 一维数组的默认值

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

对于基本数据类型而言,默认初始化值各有不同

1
2
3
4
5
6
7
8
9
10
11
12
<
基本数据类型
整型数据:byte short int long 类型数组默认初始化值为0

浮点型数据 float double 类型数组默认初始化值为0.0

boolean型数据 boolean 类型数组默认初始化值为false

字符型数据 char 类型数组默认初始化值为\u0000

<引用数据类型
默认初始化值为null

2. 多维数组

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

2.1 二维数组的初始化

静态初始化
1
2
3
4
5
6
7
8
9
String[][] arr = new String[][]{{"杨过","13357737898"},{"洪七公","17625959595"},{"郭靖","17768108828","南京人"}};
//定义一个名称为arr的二维数组,二维数组中有三个一维数组
//每一个一维数组中具体元素也都已初始化

//第一个一维数组 arr[0] = {"杨过","13357737898"};
//第二个一维数组 arr[1] = {"洪七公","17625959595"};
//第三个一维数组 arr[2] = {"郭靖","17768108828","南京人"};

//第三个一维数组的长度表示方式:arr[2].length;
动态初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//格式一:
int[][] arr = new int[3][2]
//定义了名称为arr的二维数组
//二维数组中有3个一维数组
//每一个一维数组中有2个元素
//一维数组的名称分别为arr[0], arr[1], arr[2]
//给第一个一维数组1脚标位赋值为78写法是:arr[0][1] = 78;


//格式二:
int[][] arr = new int[3][];
//二维数组中有3个一维数组。
//每个一维数组都是默认初始化值null (注意:区别于格式1)
//可以对这个三个一维数组分别进行初始化
arr[0] = new int[3];
arr[1] = new int[1];
arr[2] = new int[2];
注意特殊写法情况:
1
2
3
4
int[] x,y[]; 
//通过声明两个数组,分别是 x , y
//x是一维数组,y是二维数组。

3. 数组内存原理

内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。

3.1 JVM的内存划分

为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式。

区域名称 作用
寄存器 给CPU使用,与我们开发无关。
本地方法栈 JVM在使用操作系统功能的时候使用,与我们开发无关。
方法区 存储可以运行的.class文件,以及class相关的信息,类中方法的相关的信息
堆内存 存储对象或者数组,new来创建的,都存储在堆内存。(会给所有的元素一个默认值)
方法栈 方法运行时使用的内存,比如main方法运行,进入方法栈中执行。

3.2 数组内存原理图

一维数组

二维数组

4. 操作数组的工具类–Arrays

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

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

5. 数组练习

使用二维数组打印一个 10 行杨辉三角

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

….

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
43
/**
* 【提示】
* 1. 第一行有 1 个元素, 第 n 行有 n 个元素
* 2. 每一行的第一个元素和最后一个元素都是 1
* 3. 从第三行开始, 对于非第一个元素和最后一个元素的元素.
* yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];
*/

public static void main(String[] args){

int num = 10;
//创建二维数组
int[][] yanghui = new int[num][];

//给二维数组赋值
for (int i = 0; i < yanghui.length; i++) {

yanghui[i] = new int[i+1];
//给每一行的首 尾元素赋值
yanghui[i][0] = yanghui[i][i] = 1;

//给每一行的非首尾元素赋值
if(i>1){
for (int j = 1; j < yanghui[i].length-1; j++) {
yanghui[i][j] = yanghui[i-1][j-1] + yanghui[i-1][j];
}
}

}


//遍历二维数组,打印出答案
for (int i = 0; i < yanghui.length; i++) {
for (int j = 0; j < yanghui[i].length; j++) {
System.out.print(yanghui[i][j]+"\t");
}
//作用是换行
System.out.println();
}



}//主方法的结尾