假设我们要储存五名同学的数学成绩,并对其进行输出,
public class Test {//为什么要使用数组public static void main(String[] args) {int student1 = 89;int student2 = 82;int student3 = 68;int student4 = 90;int student5 = 73;System.out.println(student1);System.out.println(student2);System.out.println(student3);System.out.println(student4);System.out.println(student5);}
}
在这种情况下,我们发现我们需要重复的创建变量,这大大降低了我们写代码的效率。我们发现这些数据的类型是相同的,这时我们就可以使用变量。
数组:相同类型元素大的一个集合。 在内存中是一段连续的空间。
【数组的特点】
那么我们如何创建数组呢?
T[] 数组名 = new T[N];
T:表示数组存放元素的类型
T[]:数组的数据类型;
N:表示数组的长度。
【数组创建的示例】
//数组创建的示例public static void main(String[] args) {int[] array2 = new int[5];double[] array3 = new double[3];}
数组的初始化主要分为两种类型:动态初始化和静态初始化。
int[] array = new int[10];
int[] array = new int{1,2,3,4,5,6};
int[] array = {1,2,3,4,5,6};
【注意事项】
int[] array = new int[5];
int array[] = new int[5]; //语法支持,但不推荐;
int array[5] = new int[5];//语法不支持
int[] array1;
array1 = new int[10];
int[] array2;
array2 = new int[]{10,20,30};
//array2 = {1,2,3} 这种格式是错误的。
//数组元素的访问public static void main(String[] args) {int[] array = new int[]{1,2,3,4,5};for (int i = 0; i < array.length; i++) {System.out.println(array[i]);}}
【注意事项】
遍历:是指将数组中的所有元素都访问一遍。
【三种遍历数组的方法】
//数组元素的访问public static void main(String[] args) {int[] array = new int[]{1,2,3,4,5};for (int i = 0; i < array.length; i++) {System.out.println(array[i]);}for (int x: array) {System.out.println(x);}System.out.println(Arrays.toString(array));}
第一种遍历的方式,我们能够轻松理解;
第二种我们可以使用 for-each 遍历数组;
第三种我们可以使用 java 提供的包内的方法来遍历数组。

基本变量:基本数据类型所创立的变量,空间存放的是所对应的值;
引用变量:引用数据类型说创建的变量,其空间中储存的是对象所在空间的地址。
//基本数据类型和引用数据类型所存放的位置public static void main(String[] args) {int a = 29;int b = 99;double[] array = new double[]{3.14, 1.56, 4.99};}
在上述代码中a\b\array,都是函数内部的变量,因此其开辟的空间都在main方法对应的栈帧中分配。

***null 在Java中表示“空引用”,也就是一个不指向对象的引用。
//nullpublic static void main(String[] args) {int[] array = null;System.out.println(array[0]);}

null 的作用类似于C语言的空指针,都是表示一个无效的内存地址,如果我们对它进行操作会导致空指针异常问题(NullPointerException)。
Java中没有约定 null 与 0 号地址有任何关系。
//数组的应用场景 保存数据public static void main(String[] args) {int[] students = {99, 100, 66};for (int x: students) {System.out.print(x + " ");}}
//参数传基本数据类型public static int func(int num) {num = 0;return num;}public static void main(String[] args) {int num = 20;func(num);System.out.println(num);}
在这种情况下,形参只是实参的临时拷贝,我们修改形参的值,并不会影响实参。
//参数传数组类型public static int[] func (int[] array) {for (int i = 0; i < array.length; i++) {array[i] = i;}return array;}public static void main(String[] args) {int[] array = {10, 20, 30};func(array);for (int x: array) {System.out.print(x + " ");}}
我们发现,如果对引用类型进行数值上的修改,数组的内容会真的改变。
总结:所谓的引用本质上只是存了一个地址。Java中将数组设定成引用类型,这样的话后续进行数组参数传参,***其实只是将数组的地址传到函数的形参当中,但是使用的仍让是堆上相同的空间。

示例:获取斐波那契数列的前N项
//作为方法的返回值 获取斐波那契数列的前N项public static int[] fibonacci (int num) {int[] array = new int[num];array[0] = 1;array[1] = 1;for (int i = 2; i < num; i++) {array[i] = array[i-1] + array[i-2];}return array;}public static void main(String[] args) {int n = 9;System.out.println(Arrays.toString(fibonacci(n)));}
//数组转字符串public static void main(String[] args) {int[] array = {10, 20, 30, 40, 50};String str = Arrays.toString(array);System.out.println(str);}
Java中提供了 Java.util.Arrays 包,其中包含了一些操作数组的常用方法。
//数组拷贝public static void main(String[] args) {int[] array = {10, 20, 30, 40, 50, 60};//copyOf 方法进行拷贝,并会建立一个新的数组int[] newArr1 = Arrays.copyOf(array, array.length);System.out.println(Arrays.toString(newArr1));//拷贝某个范围int[] newArr2 = Arrays.copyOfRange(array, 2, 5);System.out.println(Arrays.toString(newArr2));}
二维数组本质上就是一维数组,只不过每个元素又是一个一维数组。
【基本语法】
数据类型[][] 数组名称 = new 数据类型[行数][列数]{初始化数据类型};
【代码示例】
//二维数组public static void main(String[] args) {int[][] array1 = {{1,2}, {3,4}};int[][] array2 = new int[][]{{1,2}, {3,4}};int[][] array3 = new int[2][2];int[][] array4 = new int[2][];}
二维数组创建的方式有四种,第一种和第二种直接初始化,第三种和第四种指定元素的个数,但不能初始化,这里与C语言有点不一样,Java中不要指定列数,指定相应的行数即可。
二维数组我们在此处只做简单的了解。
下一篇:下雨时,花儿是新的,雷声开始刺痛