1.数组
数组的内存图?
Java的内存分配?
*堆
*栈
*方法区
本地方法栈
寄存器
一个数组的内存图? int[] arr = new int[3]; arr[0] = 12; arr[2] = 14; System.out.println(arr[0]);//12 System.out.println(arr[1]);//0 System.out.println(arr[2]);//14 System.out.println(arr);//[I@7852e922
二个数组的内存图?
int[] arr1 = new int[]{23,12,5}; System.out.println(arr1[0]); System.out.println(arr1[1]); System.out.println(arr1[2]); System.out.println(arr1); arr1[0] = 13; System.out.println(arr1[0]); int[] arr2 = {14,18,15}; System.out.println(arr2[0]); System.out.println(arr2[1]); System.out.println(arr2[2]); System.out.println(arr2); arr2[1] = 12; System.out.println(arr2[1]);
一个变量两个数组容器的内存图?
int[] arr = new int[3]; System.out.println(arr[0]); arr[0] = 3; System.out.println(arr[0]); System.out.println(arr); arr = new int[5]; System.out.println(arr[0]); arr[0] = 5; System.out.println(arr[0]); System.out.println(arr);
两个变量指向一个数组容器的内存图?
int[] arr1 = new int[3]; System.out.println(arr1[0]); arr1[0] = 12; System.out.println(arr1[0]); System.out.println(arr1); int[] arr2 = arr1; System.out.println(arr2[0]); arr2[0] = 13; System.out.println(arr2[0]); System.out.println(arr2); System.out.println(arr1[0]);
我们在使用数组的时候经常遇到的两个错误?
1.ArrayIndexOutOfBoundsException(数组索引越界异常) int[] arr = new int[3]; System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); System.out.println(arr[3]);//这一行会引发数组索引越界异常,因为数组中根本没有3索引 2.NullPointerException(空指针异常) int[] arr = {12,14,13}; System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); arr = null; System.out.println(arr[0]);//这一行会引发空指针异常,因为arr的值为null了 注意:null是空常量,只能赋值给引用数据类型的变量 int[] arr = null; String s = null;
数组的常见操作?
遍历? int[] arr = {1,2,3,4,5}; for(int i = 0; i < arr.length; i++) { System.out.println(arr[i]); } 获取最值? 方式一: int[] arr = {3,5,2,1,4}; int max = arr[0];//记录的是元素 for(int i = 1; i < arr.length; i++) { if(max < arr[i]) { max = arr[i]; } } System.out.println(max); 方式二: int[] arr = {3,5,2,1,4}; int max = 0;//记录的是索引 for(int i = 1; i < arr.length; i++) { if(arr[max] < arr[i]) { max = i; } } System.out.println(arr[max]); 基本查找? Scanner sc = new Scanner(System.in); System.out.println("请您输入一个数字:"); int num = sc.nextInt(); int[] arr = {12, 4, 13, 10, 1}; boolean b = false;//false代表没找到,true代表找到了 int index = -1; for(int i = 0; i < arr.length; i++) { if(arr[i] == num) { b = true; index = i; break; } } if(b) { System.out.println("找到了"); } else { System.out.println("没找到"); } System.out.println(index);
数组的反转?
反转前:{1,2,3,4,5} 反转后:{5,4,3,2,1} 方式一: int[] arr = {1,2,3,4,5}; //反转前: for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } System.out.println(); for(int i = 0; i < arr.length/2; i++) { int temp = arr[i]; arr[i] = arr[arr.length-1-i]; arr[arr.length-1-i] = temp; } //反转后: for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } 方式二: for(int i = 0, j = arr.length - 1; i < arr.length / 2; i++, j--) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } 排序? 排序前:{4,1,5,3,2} 排序后:{1,2,3,4,5} 方式一:选择排序 int[] arr = {4,1,5,3,2,9}; //排序前: for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } System.out.println(); for(int i = 0; i < arr.length - 1; i++) { for(int j = i + 1; j < arr.length; j++) { if(arr[i] > arr[j]) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } } //排序后: for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } 方式二:冒泡排序 int[] arr = {4, 1, 5, 3, 2}; for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } System.out.println(); for(int i = 0; i < arr.length - 1; i++) { for(int j = 0; j < arr.length-1-i; j++) { if(arr[j] > arr[j+1]) { int temp = arr[j]; arr[j] = arr[j+1]; arr[j+1] = temp; } } } for (int i = 0; i < arr.length; i++) { System.out.print(arr[i] + " "); } System.out.println();