数组,内存分配
数组
1、格式:数据类型 [ ] 数组名 = new 数据类型[数组长度];
例:int [ ] a = new int[5];
1 //案例 2 int [ ] arr = new int [5]; //动态初始化,在内存中开辟连续的5块空间 3 System.out.println(arr[0]); //系统给出默认初始化值,整数类型都是0 4 5 arr[0]=10; 6 System.out.println(arr[0]);
- 整数类型:byte,short,int,long默认初始化值都是0.
- 浮点类型:float,double默认初始化值都是0.0
- 布尔类型:boolean默认初始化值false
- 字符类型:char默认初始化值'\u0000',每一个0代表的是16进制的0,所以4个0就是16个二进制位
2、内存分配
(1)栈
存储局部变量
局部变量:定义在方法声明上和方法中的变量
(2)堆
存储new出来的数组或对象
(3)方法区
面向对象部分讲解
(4)本地方法区
和系统相关
(5)寄存器
给CPU使用
3、数组的静态初始化
简化格式:数据类型 [ ] 数组名 = {元素1,元素2,……};
4、数组的两个小问题:
(1)数组索引越界异常:ArrayIndexOutOfBoundsException
原因:访问了不存在的索引
例:int [ ] arr = new int[5];
System.out.println(arr[5]); //当访问数组中不存在的索引,会出现索引越界异常
(2)空指针异常:NullPointerException
原因:数组已经不再指向堆内存了,但是还去用数组名访问元素
例:int [ ] arr = {1,2,3};
arr = null;
System.out.println(arr[0]);
5、数组的遍历:
就是一次输出数组中的每一个元素
int [ ] arr = {11,22,33,44,55}; //第一种(不适用) System.out.println(arr[0]); System.out.println(arr[1]); System.out.println(arr[2]); System.out.println(arr[3]); System.out.println(arr[4]); //第二种(循环) for(int i =0;i<5;i++){ System.out.println(arr[i]); } //第三种 //arr.length表示数组的长度 //System.out.println(arr.length); for(int i =0;i<arr.length;i++){ System.out.println(arr[i]); }
6、数组获取最值
//例子 public static void main(String[] args){ int [ ] arr = {33,44,55,22,11}; int max = getMax(arr); System.out.println(max); } /*
1、返回值类型int
2、参数列表int[ ] arr
*/ public static int getMax(int [ ] arr){ int max = arr[0]; for(int i =1;i<arr.length;i++){ //从数组的第二个元素开始遍历 if(max<arr[i]){ //如果max记录的值小于数组中的元素 max = arr[i]; //max记录较大值 } } return max; }
7、数组的反序
public static void main(String[ ] args){ int[ ] arr ={11,22,33,44,55}; reverseArray(arr); print(arr); } /* 1、明确返回值类型void 2、明确参数列表int[ ] arr */ public static void reverseArray(int[ ] arr){ for(int i=0;i<arr.length/2;i++){ //arr[0]和arr[arr.length-1]交换 //arr[1]和arr[arr.length-1-1]交换 //arr[2]和arr[arr.length-1-2]交换 //…… int temp = arr[0]; arr[0] = arr[arr.length-1-i]; arr[arr.length-1-i] = temp; } } /* 数组遍历 1、明确返回值类型void 2、明确参数列表int[ ] arr */ public static void print(int[ ] arr){ for(int i = 0;i<arr.length;i++){ //遍历数组中的每一个元素 System.out.print(arr[i]+" "); } }
8、查表法
//数组查表法,根据键盘录入索引,查找对应星期 public static void main(String[] args){ Scanner sc = new Scanner(System.in); System.out.println(""); int week = sc.nextInt(); System.out.println("星期"+getWeek(week)); } /* 根据索引返回对应的星期 1、返回值类型char 2、参数列表 int week */ public static char getWeek(int week){ char[ ] arr = {' ','一','二','三','四','五','六','日'); //定义一张星期表 return arr[week]; //通过索引获取表中的元素 }
9、基本查找
//例子 public static void main(String[] args) { int[] arr = {11,22,33,44,55,66,77}; int index = getIndex(arr,33); System.out.println(index); } /** * 查找元素索引 * 1、返回值类型int * 2、明确参数列表,int[] arr,int value */ public static int getIndex(int[] arr,int value){ for(int i=0;i<arr.length;i++){ //数组的遍历 if(arr[i] == value){ return i; } } return -1; } }
10、二维数组
格式:数据类型 数组名 [ ] [ ] = new 数据类型 [ ] [ ];
//例子 public static void main(String[] args) { int arr [][] = new int[3][2]; /** * 这是一个二维数组 * 这个二维数组中有三个一维数组 * 每个一维数组中有两个元素 */ //输出二维数组名称,一维数组名称,一个元素 System.out.println(arr); System.out.println(arr[0]); System.out.println(arr[0][0]); }
11、二维数组求和
//例子 /** * 需求:公司年销售额求和 * 某公司按照季度和月份统计的数据如下:单位(万元) * 第一季度:22,66,44 * 第二季度:77,33,88 * 第三季度:25,45,65 * 第四季度:11,66,99 * */ public static void main(String[] args) { int [][] arr = {{22,66,44},{77,33,88},{25,45,65},{11,66,99}}; int sum=0; //定义变量,记录每次增加的结果 for(int i=0;i<arr.length;i++){ //获取每一个一维数组 for(int j=0;j<arr[i].length;j++){ //获取每一个一维数组中的元素 sum=sum+arr[i][j]; } } System.out.println(sum); }