1、数组
--这里默认二维数组为最高,更高维度的数组不是不可以,而是就好比是多层循环没有价值
--数组定义:固定长度的容器
1、数据类型[][]... 数组名 = new 数据类型[num][num]...
--int[][] a = new int[3][4];
--int[] b = new int[12];
--对于多维数组,其length是指第一维长度
--这种需要给定数组大小,不赋值
2、数据类型[][].. 数组名 = new 数据类型[][]{data1, data2, data3, ...}
--int[] arr = new int[]{1,2,3,4,5};
--int[][] c = new int[][]{{1}, {1, 2, 3, 4, 5, 6}};
--这种方式通过所赋的值确定元素个数和纬度分布
3、数据类型[][].. 数组名 = {{}, {}, ...}
--int[] arr = {1,2,3,4,5};
--int[][] brr = {{5, 6, 7}, {1, 2}};
public static void main(String[] args){
int[] a = new int[3];
int[][] b = new int[3][4];
int[][] c = new int[][]{{1,}, {2, 3, 4, 5, 6}};
int[][] brr = {{5, 6, 7}, {1, 2}};
System.out.println(a.length);
System.out.println(b.length);
System.out.println(c[0].length);
System.out.println(brr[0][2]);
}
--数组元素调用
只需要记住一点,索引从0开始,最大索引为length-1
2、数组原理内存
--jvm内存划分
--寄存器:给cpu使用,和我们开发无关
--本地方法栈:jvm调用系统功能时使用的,和我们无关
--方法区:存储可以运行的class文件
--堆内存:存储对象或者数组,new创建的就存储在堆中
--方法栈:方法运行时使用的内存,比如main方法运行时进入方法栈中执行
--变量arr保存的是数组的地址,而arr[]这种才是取出元素,和python完全不一样
int[] arr = new int[3];
System.out.println(arr);//[I@5f150435
--int [] [] a = new int [2] [12];
--这里表示 [] 和 []之间有没有空格无所谓的,很多拿不准的建议自己写一点代码测试一下
--获取数据类型
public static void main(String[] args){
int l=100;
short f = 12;
System.out.println(getType(l));
int[] a = new int[3];
int[][] b = new int[3][4];
int[][] c = new int[][]{{1,}, {2, 3, 4, 5, 6}};
int[][] brr = {{5, 6, 7}, {1, 2}};
System.out.println(a.length);
System.out.println(b.length);
System.out.println(c[0].length);
System.out.println(brr[0][2]);
System.out.println(b.getClass().toString());
System.out.println(getType(a));
System.out.println(getType(f));
}
public static String getType(Object o) { //获取变量类型方法
return o.getClass().toString(); //使用int类型的getClass()方法
}
--数组之间复制,本质上是指针的赋值,就是将数组变量的指针所指向的地址赋值给新的数组
--如果数组变量被赋值为null,则说明该数组不指向任何内存地址,如果使用a[0]这种方式取值会报错
NullPointerException
public static void main(String[] args) {
int[] arr = {1,2,3};
arr = null;
System.out.println(arr[0]);
}
--这里如果超出了数组的长度会报:ArrayIndexOutOfBoundsException溢出异常
3、三个小例子
1、数组遍历
2、求取最大值
3、数组交换
4、数组作为方法参数和返回值
--数组作为方法参数传入函数,传入的是数组地址
--数组作为方法返回值返回时,传出的也是数组地址
--所以如果定义的是数组变量,可以直接修改内存中数据的值,无需重新复制和C中指针类型变量一样
--传入数组参数到函数中
public static void main(String[] args) {
int[] arr = { 1, 3, 5, 7, 9 };
//调用方法,传递数组
printArray(arr);
}
/*
创建方法,方法接收数组类型的参数
进行数组的遍历
*/
public static void printArray(int[] arr) {
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
--返回数组参数到函数中
public static void main(String[] args) {
//调用方法,接收数组的返回值
//接收到的是数组的内存地址
int[] arr = getArray();
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
public static int[] getArray() {
int[] arr = { 1, 3, 5, 7, 9 };
//返回数组的地址,返回到调用者
return arr;
}
--方法的参数为基本类型时,传递的是数据值. 方法的参数为引用类型时,传递的是地址值.
import java.awt.desktop.SystemSleepEvent;
public class ListNull {
public static void main(String[] args){
int [] [] a = {{7, 8, 9}, {10, 20, 30}};
System.out.println(a[1][0]);
intoList(a);
int [][] b = reList(a);
System.out.println(b[1][0]);
System.out.println(a[1][0]);
}
public static void intoList(int [][] arrlist){
System.out.println("\n输入数组");
System.out.println(arrlist[0][2]);
System.out.println("输入数组\n");
}
public static int[][] reList(int [][] arrList){
arrList[1][0] = 1999;
arrList[1][1] = 1888;
arrList[1][2] = 1777;
return arrList;
}
}