数组知识点
1:数组的概念
2:数字的初始化
3:数组的内存分配
4:数组的问题
数组是存储同一种数据类型多个元素的集合。也可以看成是一个容器。
数组既可以存储基本数据类型,也可以存储引用数据类型。
数组定义格式 : 数据类型[] 数组名 = new 数据类型 [ 数组的长度 ];
数组的初始化有两种:静态初始化和动态初始化。我们先说动态初始化,动态初始化时只指定长度,由系统决定初始化值,如 int[] arr = new int[5];
现在我们来说一下默认的初始化值:整数类型:0
浮点型:0.0
char:\u0000
boolean:false
动态数组创建的代码:
class Test_Array {
public static void main(String[] args) {
int[] arr = new int[5];
arr[0] = 0;
arr[1] = 1;
arr[2] = 2;
arr[3] = 3;
arr[4] = 4;
}
}
让我们看一个例子:
为什么会是这样的,打印的【@1db9742是什么意思?? 解释一下 【就是一维数组,如果是【【则是二维数组 @是固定的格式,I是数据类型即整型int,后面是地址16进制的。
为什么会是这样的呢?我们来看一个图把
好,在来看一下静态数组初始化
数据类型 [] 数组名 = new 数据类型[]{1,2,3,4,5};
简化格式:
数据类型 [] 数组名 = {1,2,3,4,5};
好了,来看个例题吧!
/*
数组元素反转(就是把元素对调)
*/
class test_array {
public static void main(String[] args) {
int[] arr = new int[]{1,2,3,4,5,6,7,8,9};
System.out.println(arr);
showArray(arr);
reArray(arr);
showArray(arr);
}
public static void reArray(int[] arr) {
for(int a = 0;a <= arr.length / 2;a++) {
int tmp;
tmp = arr[a];
arr[a] = arr[arr.length - 1 - a];
arr[arr.length - 1 - a] = tmp;
}
}
public static void showArray(int[] arr) {
for(int a = 0;a < arr.length;a++) {
System.out.println("arr[" + a + "] = " + arr[a]);
}
System.out.println("------------------------------------");
}
}
二维数组的初始化
1.数据类型[][] 数组名 = new 数据类型 [3][4];
以下格式也可以表示二维数组
数据类型 数组名[][] = new 数据类型 [][];
数据类型[] 数组名[] =new 数据类型 [][];
下面我们看看这段声明合法吗?
int[] x,y[]
即声明了一个一维数组和一个二维数组能明白吧!
来看看二维数组的图解:
2还可以这样使用:
int[][] arr = new int[3][];
arr[0] = new int[4];
arr[1] = new int[1];
arr[2] = new int[2];
3.下面是静态创建数组的形式:
int[][] arr={{1,2},{1,2,3},{1,2,3,4,5,6}}
好了让我们来看一个练习吧
/*
需求:二维数组遍历
*/
class test_arr2 {
public static void main(String[] args) {
int[][] arr = {{1,2},{3,4,5,6},{7,8,9,10,11}};
for(int i = 0; i< arr.length;i++) {
for(int j = 0;j < arr[i].length;j++) {
System.out.print("a[" + i + "][" + j + "]= " + arr[i][j] + '\t');
}
System.out.println();
}
}
}
我们在来研究一下基本数据类型参数传递和引用数据类型参数传递的区别
class Test_change{
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println("a:"+a+",b:"+b);
change(a,b);
System.out.println("a:"+a+",b:"+b);
int[] arr = {1,2,3,4,5};
change(arr);
System.out.println(arr[1]);
}
public static void change(int a,int b) {
System.out.println("a:"+a+",b:"+b);
a = b;
b = a + b;
System.out.println("a:"+a+",b:"+b);
}
public static void change(int[] arr) {
for(int x=0; x<arr.length; x++) {
if(arr[x]%2==0) {
arr[x]*=2;
}
}
}
}
由上面两图我们可以很清楚的知道:基本数据类型的参数传递相当是创建了一个备份,所有的操作的在备份中执行,执行完后自动丢弃,对原值并没有影响,而引用数据类型的参数传递则是赋值的地址值,所以他们操作的是同一个对象,操作会影响!
在提一下数组的2个问题
1.空指针异常 NullPointerExecption
2.数组越界:ArrayIndexOutofBoundsException