数组的定义格式有两种:
数据类型[] 数组名;//数据类型,根据数组里的数进行调整
数据类型 数组名[];//数组的第二种格式
//举例:
int[] arr;
//定义了一个int类型的数组,数组名是arr;
int arr[];
//定义了一个int类型的变量,变量名是arr数组
数组的初始化:
a.所谓初始化就是为数组中的数据元素分配存储空间,为数组中的数据元素赋值
b.数组的初始化分为动态初始化和静态初始化两种;
动态初始化:
初始化时只制定数组的长度,由系统为数组分配初始值;
数据类型[] 数组名 = new 数组名[数组长度];
//举例;
int[] arr = new arr[4];
//数组名是arr,数组里的元素是int型,数组长度是4;
静态初始化:
数据类型[] 数组名 = new 数组名[]{元素1,元素2……};
//举例;
int[] arr = new arr[]{1,2,3,4,5};
//也可以简化写法
数据类型[] 数组名 = {元素1,元素2……};
int[] arr ={1,2,3,45};
数组的两个小问题:
a.数组索引越界
当我们查找数组元素的长度超过了数组的长度时,就会发生数组索引越界问题;
int[] arr={1,2,3,4};//定义一个长度为4的一维数组;
System.out.println(arr[4]);
//因为数组的长度是4,数组元素从0存到3,当我们输出arr[4]时,就会发生数组索引越界
b.空指针异常
当我们把数组赋值一个空指针,我们再去查找数组里的元素时,访问的数组已经不再指向堆内存的数据,就会发生空指针异常的问题;
int[] arr=new arr[4];
arr=null;
System.out.println(arr[0]);
//这里因为把数组赋予了一个空指针,数组的栈内存不再指向堆内存的元素
//再进行查找就会发生空指针异常的问题。
数组的遍历:
a.直接用输出语句输出每一个数组元素
int[] arr={1,2,3,4};
System.out.println(arr[0]);
System.out.println(arr[1]);
System.out.println(arr[2]);
System.out.println(arr[3]);
b.for循环遍历
int[] arr={1,2,3,4,5};
for(int i=0;i<=4;i++)
{
System.out.println(arr[i]);
}
//数组长度是五,所以设置一个i变量,从0递增到4
这是我们知道数组的长度的条件下遍历的数组,当我们不清楚数组的长度的时候,我们可以用数组名.length去获取当前数组的长度,举例;
int[] arr={1,2,3,4,5,6,7,8,9,};
for(int i=0;i<=arr.length;i++)
{
System.out.println(arr[i]);
}
当我们定义两个数组,并且把第一个数组的地址会赋值给第二个数组时,两个数组会共用一个地址:
二维数组:我的理解是一个一维数组里装着其他的一维数组,比如定义一个二维数组arr[3][3],这个时候arr[0]就代表这个二维数组里的第一个一维数组,arr[0][0]就代表这个二维数组里的第一个一维数组的一位元素。
二维数组的定义和一维数组的形式有着类似的样子:
动态初始化:
数据类型[][] 数组名 = new 数组名[长度][长度];
//举例
int[][] arr = new arr[2][3];
//也可以不定义完全
//因为这个二维数组中的一维数组并不一定是相同长度的
int[][] arr = new arr[2][];
静态初始化:
数据类型[][] 数组名=new 数组名[][]{{},{},{}……}
//举例
int[][] arr = new arr[][]{{1,23},{121,123}};
//和一维数组一样可以简化写法
int[][] arr = {{12,312},{123,312}}
二维数组的长度:
数组名.长度表示一位数组的个数;
数组名[].长度表示一维数组中的元素的个数;
//举例
arr.length;
arr[0].length;