目录
1 数组概述
1.1 概念
Java数组是一种常见的数据结构,可用于存储多个数据,每个数组元素存放一种数据。(但Java类与类之间可以支持继承关系,这样可能产生一个数组可以存放多种数据类型的假象)。这些无序排列的同类数据元素的集合称为数组。通常可通过数组元素的索引来访问数组元素。
1.2 优点
- 提高代码的简洁性和效率。
- 查询数据方便。
1.3 特点
- 一旦数组初始化完成,长度便不可改变。
- Java数组既可以存储基本数据类型的数据,也可以存储引用类型的数据。
- Java数组本身就是一种引用类型。
2 快速入门
2.1 一维数组
2.1.1 一维数组定义
方法一
语法:type[] arrayName;
例子:int[] a;
方法二
语法:type arrayName[];
例子:int a[]
tips: 推荐使用第一种写法,第一种有更能体现数组为一种数据类型,有更好的语义。第二种的写法的风格是来自于C/C++。而且第二种的写法也在逐渐的被淘汰掉。
2.1.2 数组的初始化
静态初始化:程序员指定数组的初始值,系统决定长度。
语法:arrayName = new type[]{element1, element2, ...};
例子:a = new int[]{1, 2, 3};
动态初始化:程序员指定长度,系统为元素分配初始值。
语法:arrayName = new type[length];
例子:a = new int[100]
tips
- java数组必须先初始化,然后才可以使用。所谓初始化就是为数组的元素分配内存空间,并为每个数组元素赋初始值。
- 声明和初始化有一种简写,此时初始化为静态初始化。
type[] arratName = {element1, element2, ...};
int[] a = {1, 2, 3};
2.1.3 访问一维数组
数组经过定义和初始化后,可以通过数组的引用变量后紧跟一个方括号([]),方括号里是数组元素的索引值进行访问。
语法:arrayName[item];
例子:a[0];
2.1.4 案例一
案例分析:定义一个int型的一维数组,包含4个元素,求出其中的最大值。
代码实现:
public static void main(String[] args){
int[] numbers; //定义一个引用变量为numbers的一维数组
numbers = new int[]{3,1,4,2}; //对numbers进行静态初始化
//也可以使用简写方法
//int[] numbers = {3,1,5,2,7,9,0,6,4,8};
int max = numbers[0];
for(int i = 0; i < numbers.length; i++){
if(max < numbers[i]){
max = numbers[i];
}
}
System.out.println("该数组的最大值为:"+ max);
}
2.2 二维数组
二维数组可以看成是一维数组为元素的一维数组。如果把二维数组作为矩阵的话,二维数组的第一个下标为行数,第二个下标为列数。
2.2.1 定义二维数组
语法:type[][] arrayName;
例子:int[][] numbers;
2.2.2 初始化二维数组
静态初始化:程序员指定数组的初始值,系统决定长度。
语法:arrayNAme = new type{{element1},{element2},...};
例子:numbers = new int{{1,2},{3,4},{5,6}};
动态初始化:程序员指定长度,系统为元素分配初始值。
语法:arrayName = new type[item1][item2];
numbers = new int[3][2];
tips
同样,二维数组也可以有简化的写法,声明的同时直接静态初始化
语法:type[][] arrayName = {{element1},{element2}{element3}};
例子:int[][] numbers={{1,2},{2,3}{4,5}};
2.2.3 案例二
案例分析:定义一个三列二行的二维数组,并求得二维数组中所有元素的值。
代码实现:
public static void main(String[] args) {
//定义一个二维数组
int[][] numbers;
//对该二维数组进行初始化
numbers = new int[][]{{1,2},{3,4},{5,6}};
//也可以使用简写方式
//int[][] numbers = {{1,2},{3,4},{5,6}};
int sum = 0;
for(int i = 0; i < numbers.length; i++){
for(int j = 0; j < numbers[i].length; j++) {
sum = sum + numbers[i][j];
}
}
System.out.println("此二维数组元素的和为:" + sum);
}
数组的内存分析
3.1 数组在内存中的定义
数组是一种引用数据类型,数组引用变量只是一个引用,数组元素和数组变量在内存里是分开存放的。
如果想要访问堆内存中的数组元素,则程序只能通过arrayName[index]的形式实现。
数组的名称只是一个引用变量,这个引用变量可以指向任何有效的内存,只有当该引用指向有效内存后,才可以通过数组变量来访问数组元素。
如果想要在程序中访问数组对象本身,只能通过这个数组的引用变量来访问它。
实际的数组对象被存放在堆(heap)内存中,引用该数组的引用变量存储在栈(stack)内存中。
3.2 案例一内存分析
内存分析:以案例一分析
int[] numbers; //定义一个引用变量为numbers的一维数组
numbers = new int[]{3,1,4,2}; //对numbers进行静态初始化
int max = numbers[0];
for(int i = 0; i < numbers.length; i++){
if(max < numbers[i]){
max = numbers[i];
}
}
- 当执行完第一行代码 int[] numbers;后,仅定义一个数组变量,然后在栈内存中定义了一个空引用(numbers数组变量)。这个引用并未指向任何有效内存。
- 当执行完第二行代码时,系统将负责为该数组变量分配内存空间,并为数组变量赋上指定的值。
- 当执行完第三行代码后,在栈内存中定义一个整型变量max,然后该变量指向数组的第一个元素地址。
- 执行循环语句,max最后会指向数组中最大的值。
3.3 二维数组内存分析
Java语言里的数组类型是引用变量,因此数组变量其实就是一个引用,这个引用指向真实的数组内存。如果数组元素的引用再次指向真实的数组内存,这看上去就像多维数组了。
内存分析:以案例二分析
int[][] numbers;
numbers = new int[][]{{1,2},{3,4},{5,6}};
- 当执行完第一行代码 int[] numbers;后,仅定义一个数组变量,然后在栈内存中定义了一个空引用(numbers数组变量)。这个引用并未指向任何有效内存。
- 当执行完第二行代码时,系统将负责为该数组变量分配内存空间,并为数组变量赋上指定的值。其数组的第一个下标对应的内存存放的只是第二下标的内存地址。
以上,是说明二维数组的本质是一维数组。
总结
一维数组
定义:type[] arrayName;
初始化:
静态初始化:arrayName = new type[]{element1,element2};
动态初始化:arrayName = new type[length];
简写:type[] arrayName = {element1,element2};
二维数组
定义:type[][] arrayName;
初始化:
静态初始化:arrayName = new type{{element1},{element2}};
动态初始化 arrayName = new type[length1][length2];
简写:type[][] arrayName = {{element1},{element2},{element3}};
这是本人对数组的浅薄见解,不足之处,还请各位大佬指出。