目录
1.数组索引越界异常(ArrayIndex0utofBoundsException)
一维数组
数组 : 一种容器,可以存储同种数据类型的多个值。
数组的使用场景 : 发现手里的数据有多个,并且这多个数据还属于同一组数据,就可以考虑使用数组容器进行维护。
一、数组静态初始化
1.介绍
初始化 : 在内存中,为数组容器开辟空间,并将数据存入容器的过程。
-
格式一:数据类型[ ] 数组名; 如:int[ ] array;
-
格式二:数据类型 数组名[ ]; 如:int array[ ];
注意:这种定义格式,定义出来的,只是数组类型的变量而已,内存中还没有创建出数组容器
2.格式
-
完整格式:数据类型[ ] 数组名 = new 数据类型[ ]{元素1,元素2,元素3...};
-
简化格式:数据类型[] 数组名 = {元素1,元素2,元素3...};
二、数组元素访问
1.介绍
索引是数组容器中空间的编号,编号从0开始,逐个+1增长
2.格式
数组名[索引]
三、数组的遍历
1.介绍
数组遍历: 将数组中所有的内容取出来,取出来之后可以(打印,求和,判断..)
2.格式
数组名.Length
动态获取到数组的长度 (元素的个数)
数组遍历的快捷键:数组名.fori + 回车
3.数组遍历的场景
如果要完成的需求,是需要操作到数组中的每一个元素,就需要对数组进行遍历操作
4.案例
求最大值
package Test;
public class ArrayTest2 {
public static void main(String[] args) {
int[] arr1 = {33,55,11,22,44};
int[] arr2 = {100,99,66,88,77};
int max = getMax(arr1);
System.out.println("最大值为:" + max);
}
public static int getMax(int[] arr){
//1.第一个选手上台(假设第一个元素就是最大值)
int max = arr[0];
//2.遍历数组,获取到每一个元素
for (int i = 1; i < arr.length; i++) {
//3.逐个比较
if(arr[i] > max){
//4.记录更大的数据
max = arr[i];
}
}
return max;
}
}
学生成绩
批量修改变量名:Shift + F6 + Fn
package Test;
/*
需求:
已知班级学生成绩为
int[] arr = {100,50,20,90,90};
1.找出数组最大值,并打印在控制台
2.找出数组最小值,并打印在控制台了。
3.求总成绩,并打印在控制台
4.计算出平均值,并打印在控制台
5.统计出低于平均值元素的个数
*/
public class ArrayTest2 {
public static void main(String[] args) {
int[] arr = {100,50,20,90,90};
int max = getMax(arr);
System.out.println("最高分为:" + max);
int min = getMin(arr);
System.out.println("最低分为:" + min);
int sum = getSum(arr);
System.out.println("班级总成绩为:" + sum);
double avg = getAvg(arr);
System.out.println("班级平均分为:" + avg);
int count = getCount(arr);
System.out.println("低于平均分的人数为:" + count);
}
/**
*1.从数组中找最大值
*/
public static int getMax(int[] arr){
//1.第一个选手上台(假设第一个元素就是最大值)
int max = arr[0];
//2.遍历数组,获取到每一个元素
for (int i = 1; i < arr.length; i++) {
//3.逐个比较
if (arr[i] > max) {
//4.记录更大的数据
max = arr[i];
}
}
return max;
}
/**
*2.从数组中找最小值
*/
public static int getMin(int[] arr){
//int[] arr = {5,44,33,55,22};
//1.第一个选手上台(假设第一个元素就是最大值)
int min = arr[0];
//2.遍历数组,获取到每一个元素
for (int i = 1; i < arr.length; i++) {
//3.逐个比较
if(arr[i] < min){
//4.记录更大的数据
min = arr[i];
}
}
return min;
}
/**
*3.数组求和
*/
public static int getSum(int[] arr){
int sum = 0;
for (int i = 1; i < arr.length; i++){
sum += arr[i];
}
return sum;
}
/**
*4.数组求平均值
*/
public static double getAvg(int[] arr){
int sum = getSum(arr);
//计算平均分
double avg = (sum * 1.0) / arr.length;
return avg;
};
/**
* 5.统计低于平均值元素的个数
*/
public static int getCount(int[] arr){
//1.定义计数器变量
int count= 0;
//2.计算平均分
double avg = getAvg(arr);
//3.统计
for(int i = 0;i < arr.length;i++){
if (arr[i] < avg){
count++;
}
}
return count;
}
}
运行结果
四、数组动态初始化
1.介绍
动态初始化:初始化时只指定数组长度,由系统为数组分配初始值
2.格式
①数据类型[ ] 数组名 = new 数据类型[数组长度];
范例:int[] arr = new int[3];
②默认值类型:
-
整数 : 0
-
小数 : 0.0
-
布尔 : false
-
字符 :'\u0000' --->Unicode字符 --->常见的体现是空白字符
-
引用数据类型 : null(引用数据类型:数组、类(如String)、接口)
五、静态初始化和动态初始化的区别
-
动态初始化:手动指定数组长度,由系统给出默认初始化值。(只明确元素个数,不明确具体数值)
-
静态初始化:手动指定数组元素,系统会根据元素个数,计算出数组的长度。(如果要操作的数据,需求中已经明确给出了,直接静态初始化)
抽取方法的快捷键:Ctrl + Alt + M
六、Java内存分配介绍
方法的参数传递问题
1.基本数据类型: 传递的是数据值
解决方法:return
2.引用数据类型: 传递的是地址值
七、数组常见问题
1.数组索引越界异常(ArrayIndex0utofBoundsException)
原因: 访问了不存在的索引。
例如:
package exception;
public class ArrayIndex0utofBoundsException {
public static void main(String[] args) {
int[] arr = {11,22,33};
for(int i = 0;i <= arr.length;i++){
//i = 0,1,2,3
System.out.println(arr[i]);
}
}
}
2.空指针异常(NullPointerException)
原因: 当引用数据类型的变量,被赋值为null之后,就代表跟堆内存的连接被切断了。这时候还想去访问堆内存的数据,就会出现空指针异常。
例如:
package exception;
public class NullPointerException {
public static void main(String[] args) {
int[] arr = {11,22,33};
arr = null;
System.out.println(arr[0]);
}
}
二维数组
二维数组:是一种容器,该容器用于存储一维数组。
使用思路:今后若要操作的多组数据,属于同一组数据就可以考虑使用二维数组进行维护
一、静态初始化
1.格式
-
完整格式:数据类型[ ] [ ] 数组名 = new 数据类型[ ] [ ] {{元素1,元素2},{元素1,元素2}};
-
范例: int[ ] [ ] arr = new int[ ] [ ]{{11,22},{33,44}};
-
简化格式: 数据类型[ ] [ ] 数组名 = {{元素1,元素2},{元素1,元素2}};
-
范例:int[ ] [ ] arr = {{11, 22},{33,44}};
细节: 二维数组在存储一维数组的时候,具体存储的是一维数组的地址值
2.访问格式
格式:数组名[索引] [索引];
范例:int[ ] [ ] arr = new int[ ] [ ]{{11,22},{33,44}};
arr[1] [0];
二、二维数组遍历
1.打印
需求:已知一个二维数组arr = { {11 , 22 , 33} , {33 , 44 , 55} };遍历该数组,取出所有元素并打印
分析:
-
遍历二维数组,取出里面每一个一维数组
-
在遍历的过程中,对每一个一维数组继续完成遍历,获取内部存储的每一个元素
package Array;
public class ArrayTest1 {
public static void main(String[] args) {
int[][] arr= {
{11, 22, 33},
{33, 44, 55}
};
printArray(arr);
}
public static void printArray(int[][] arr) {
for (int i = 0; i < arr.length; i++) {
//arr[i] 每一个一维数组
for (int j = 0; j < arr[i].length; j++) {
System.out.println(arr[i][j]);
}
}
}
}
2.求和
需求:已知一个二维数组arr = { {11 , 22 , 33} , {33 , 44 , 55} };对内部存储的元素累加求和,并将结果输出在控制台
分析:
-
定义求和变量
-
遍历二维数组,取出里面每一个一维数组
-
在遍历的过程中,对每一个一维数组继续完成遍历,获取内部存储的每一个元素
-
求和累加
-
打印求和结果
package Array;
public class ArrayTest1 {
public static void main(String[] args) {
int[][] arr= {
{11, 22, 33},
{33, 44, 55}
};
printArray(arr);
int sum = getSum(arr);
System.out.println("求和结果为:" +sum);
}
public static void printArray(int[][] arr) {
for (int i = 0; i < arr.length; i++) {
//arr[i] 每一个一维数组
for (int j = 0; j < arr[i].length; j++) {
System.out.println(arr[i][j]);
}
}
}
public static int getSum(int[][] arr){
int sum = 0;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
sum += arr[i][j];
}
}
return sum;
}
}
三、二维数组动态初始化
1.格式
数据类型 [ ] [ ] = new 数据类型[m] [n];
m表示这个二维数组,可以存放多少个一维数组
n表示每一个一维数组,可以存放多少个元素
范例:int[] [] arr = new int[2] [3];
2.案例
能否将提前创建好的一维数组,直接存入二维数组中?
package Array;
public class ArrayTest2 {
public static void main(String[] args) {
int[] arr1 = {11,22,33};
int[] arr2 = {44,55,66};
int[][] arr = new int[2][3];
arr[0] = arr1;
arr[1] = arr2;
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.println(arr[i][j]);
}
}
}
}