数组:可以看成是相同类型元素的一个集合,在内存中占据连续的空间,每个元素都有自己的编号(下标),起始位置下标为0

Java中,创建数组的格式如下,其中
T:数组中存放元素的类型T[]:表示数组的类型N:表述数组长度T[] 数组名 = new T[N];
例如下面的例子
public class TestDemo {
public static void main(String[] args) {
//创建一个可以容纳10个int类型元素的数组
int[] arr1 = new int [10];
//创建一个可以容纳5个double类型元素的数组
double[] arr2 = new double[5];
//创建一个可以容纳3个字符串元素的数组
String[] arr3 = new String[3];
}
}
Java是一门纯面向对象语言,所以在Java中一切皆对象,数组当然也不例外。当使用int[] arr1 = new int [10]这样的语句创建了一个数组之后,其中arr1就称之为引用变量,存储了对象的地址,它引用或指向了一个数组对象。使用 System.out.println(arr1)打印该引用变量,结果显示

[:表示这是数组类型I:数组里面存储的是整型@1b6d3586:这是数组地址的哈希值注意:
int arr[] = {1, 2, 3}这样的操作null)
动态初始化:创建数组时直接指定数组中元素的个数,例如
int[] array = new int[10];
静态初始化:在创建数组时不直接指定数据元素个数,而直接赋值具体数据,例如
{}中元素个数来确定数组的长度{}中数据类型必须与[]前数据类型一致new T[],即int[] arr1 = {1, 2, 3}(不推荐这样写,因为关键字new更能体现出对象这个含义,而且编译器本身还是会还原的)public class TestDemo{
public static void main(String[] args) {
int[] arr1 = new int[]{0, 2, 4, 5, 6};
String[] arr2 = new String[]{"hello", "this", "world"};
}
}
数组元素访问:数组在内存中是一段连续的空间,空间的编号都是从0开始的,然后依次递增,该编号称为数组的下标。数组可以通过下标访问其任意位置的元素。下标取值范围为:[0, N),其中N为元素个数,访问时下标不能大于等于N,否则编译器会报越界错误。如下:
public class TestDemo{
public static void main(String[] args) {
int[] arr = new int[]{1, 2, 3};
System.out.println(arr[1]);
System.out.println(arr[3]);//越界
}
}

遍历数组:遍历是指将数组中的所有元素都访问一遍同时执行某种操作(例如最简单的打印)。遍历数组时需要数组的长度,所以可以使用数组对象.length的方式获取。例如
public class TestDemo{
public static void main(String[] args) {
int[] arr = new int[]{11, 22, 33, 44, 55, 66, 77};
for(int i = 0; i < arr.length; i++){
arr[i] *= 2;
System.out.print(arr[i]+" ");
}
}
}

和C/C++类似,为了对内存进行合理分配和管理,JVM会将内存按照如下逻辑划分

new创建的对象都是保存在堆上的。堆的生命周期和程序的生命周期一致基本类型变量:基本数据类型创建的变量,称为基本变量,该变量空间中直接存放的是其所对应的值
引用类型变量:引用数据类型创建的变量,一般称为对象的引用,其空间中存储的是对象所在空间的地址。它类似于C/C++中的指针
有如下代码,其变量在内存中的分布情况如下图所示
public class TestDemo {
public static void main(String[] args) {
int a = 10;
int b = 20;
int[] arr = new int[]{1, 2, 3};
}
}

如果具有C/C++中指针基础,那么引用变量学习起来应该是没有任何问题的,下面的例子也生动的展示了引用的作用
public class TestDemo {
public static void main(String[] args) {
//定义一个引用变量arr1指向数组
int[] arr1 = new int[3];
//利用该引用变量操作数组
arr1[0] = 10;
arr1[1] = 20;
arr1[2] = 30;
int[] arr2 = new int[]{1, 2, 3, 4, 5};
arr2[0] = 100;
arr2[1] = 200;
//重点:让arr1指向arr2,然后arr1修改arr2数组
arr1 = arr2;
arr1[2] = 300;
arr1[3] = 400;
arr1[4] = 500;
for(int i = 0 ; i < arr2.length; i++){
System.out.println(arr2[i]);
}
}
}

Java中使用null代表空引用,表示该引用变量不指向任何对象
NullPointerException错误int[] arr = null;
略
前面说过,对于基本类型,在传递参数时是传值,也即形参并不会影响到实参。而数组这种引用类型在传参时是传引用,也即形参会直接操作实参
public class TestDemo {
public static void modif(int[] arr1){
arr1[0] = 100;
}
public static void main(String[] args) {
int[] arr = new int[]{1, 2, 3};
System.out.println("修改前:" + arr[0]);
modif(arr);
System.out.println("修改后:" + arr[0]);
}
}
