数组
一、一维数组
1、数组的定义方式
数据类型[] 数组名 = new 数据类型[元素个数或数组长度];
int[] x = new int[100];
拆分:
int[] x; // 声明一个int[]类型的变量 x = new int[100]; // 创建一个长度为100的数组
2、一维数组内存图解:
3、定义数组和访问数组中的元素:
1public class ArrayDemo01 { 2 public static void main(String[] args) { 3 int[] arr; // 声明变量 4 arr = new int[3]; // 创建数组对象 5 System.out.println("arr[0]=" + arr[0]); // 访问数组中的第一个元素 6 System.out.println("arr[1]=" + arr[1]); // 访问数组中的第二个元素 7 System.out.println("arr[2]=" + arr[2]); // 访问数组中的第三个元素 8 System.out.println("数组的长度是:" + arr.length); // 打印数组长度 9 } 10}
4、各种数据类型的数组默认初始化值:
5、元素赋值方式:
1public class ArrayDemo02 { 2 public static void main(String[] args) { 3 int[] arr = new int[4]; // 定义可以存储4个整数的数组 4 arr[0] = 1; // 为第1个元素赋值1 5 arr[1] = 2; // 为第2个元素赋值2 6 // 下面的代码是打印数组中每个元素的值 7 System.out.println("arr[0]=" + arr[0]); 8 System.out.println("arr[1]=" + arr[1]); 9 System.out.println("arr[2]=" + arr[2]); 10 System.out.println("arr[3]=" + arr[3]); 11 } 12}
6、数组的静态初始化方式:
1)、类型[] 数组名 = new 类型[]{元素,元素,……};
2)、类型[] 数组名 = {元素,元素,元素,……};
实例:
1public class ArrayDemo03 { 2 public static void main(String[] args) { 3 int[] arr = { 1, 2, 3, 4 }; // 静态初始化 4 // 下面的代码是依次访问数组中的元素 5 System.out.println("arr[0] = " + arr[0]); 6 System.out.println("arr[1] = " + arr[1]); 7 System.out.println("arr[2] = " + arr[2]); 8 System.out.println("arr[3] = " + arr[3]); 9 } 10}
7、总结:
public static void main(String[] args) { //数组定义 int[] x=new int[3]; int[] a={2,4,6,8,3,5,9}; //赋值 x[0]=1; x[1]=2; x[2]=3; //取值 System.out.println(x[2]); for(int i=0;i<a.length;i++){ System.out.println(a[i]); } }
二、数组遍历
在操作数组时,经常需要依次访问数组中的每个元素,这种操作称作数组的遍历。
方式:
public class ArrayDemo04 { public static void main(String[] args) { int[] arr = { 1, 2, 3, 4, 5 }; // 定义数组 // 使用for循环遍历数组的元素 for (int i = 0; i < arr.length; i++) { System.out.println(arr[i]); // 通过索引访问元素 } } }
三、数组最值
方法:
public static void main(String[] args) { int[] arr = { 4, 1, 6, 3, 9, 8 }; // 定义一个数组 int max = arr[0]; // 定义变量max用于记住最大数,首先假设第一个元素为最大值 // 下面通过一个for循环遍历数组中的元素 for (int x = 1; x < arr.length; x++) { if (arr[x] > max) { // 比较 arr[x]的值是否大于max max = arr[x]; // 条件成立,将arr[x]的值赋给max } } System.out.println("max=" + max); // 打印最大值 }
最小值同理
四、数组常见问题:
1、数组越界异常:
每个数组的索引都有一个范围,即0~length-1。在访问数组的元素时,索引不能超出这个范围,否则程序会报错
实例:
1public class ArrayDemo06 { 2 public static void main(String[] args) { 3 int[] arr = new int[4]; // 定义一个长度为4的数组 4 System.out.println("arr[0]=" + arr[4]); // 通过角标4访问数组元素 5 } 6}
上图运行结果中所提示的错误信息是数组越界异常ArrayIndexOutOfBoundsException,
出现这个异常的原因是数组的长度为4,其索引范围为0~3,
而上述代码中的第4行代码使用索引4来访问元素时超出了数组的索引范围。
2、空指针异常
在使用变量引用一个数组时,变量必须指向一个有效的数组对象,如果该变量的值为null,
则意味着没有指向任何数组,此时通过该变量访问数组的元素会出现空指针异常
1public class ArrayDemo07 { 2 public static void main(String[] args) { 3 int[] arr = new int[3]; // 定义一个长度为3的数组 4 arr[0] = 5; // 为数组的第一个元素赋值 5 System.out.println("arr[0]=" + arr[0]); // 访问数组的元素 6 arr = null; // 将变量arr置为null 7 System.out.println("arr[0]=" + arr[0]); // 访问数组的元素 8 } 9}
通过上图所示的运行结果可以看出,上述代码中第4、5行代码都能通过变量arr正常地操作数组。
第6行代码将变量置为null,当第7行代码再次访问数组时就出现了空指针异常NullPointerException。
五、二维数组
1、定义方式:
int[][] arr1=new int[3][4];//方式1 int[][] arr2=new int[3][];//方式2 arr2[0]={1,2,3,4,5}; arr2[1]={4}; arr2[2]={23,123,2345} int[][] arr3={{1,2,3}{2,3}{6}};//方式3
2、二维数组遍历
for(int i=0;i<arr.length;i++){ for(int j=0;j<arr2[i].length;j++){ System.out.print(arr2[i][j]+""); } System.out.println();
3、二维数组内存图解:
练习1:
第一小组销售额为{11, 12}万元
第二小组销售额为{21, 22, 23}万元
第三小组销售额为{31, 32, 33, 34}万元。
求:
公司三个销售小组中每个小组的总销售额以及整个公司的销售额
int[][] arr={{11,12},{21,22,23},{31,32,33,34}}; int a=0; int count=0; for(int i=0;i<arr.length;i++){ for(int j=0;j<arr[i].length;j++){ count=count+arr[i][j]; } System.out.println("第"+(i+1)+"组销售总额:"+count); a+=count; count=0; } System.out.println("总销售额:"+a);
练习2:
随机点名
import java.util.Random; class demo2 { public static void main(String[] args) { String[] str={"A","B","C",D","E","F","G","H","I","J","K"}; Random r=new Random(); int index=r.nextInt(str.length); System.out.println(str[index]); } }
例题:
1.编写代码实现如下内容:if语句实现考试成绩分等级(使用switch语句)。
[90-100] A等。
[80-90) B等。
[70-80) C等。
[60-70) D等。
[0-60) E等。
请根据给定成绩,输出对应的等级。
说明:"["表示包含,")"表示不包含
//第一题 Scanner sum=new Scanner(System.in); int sss=sum.nextInt(); int sc=(int)sss / 10; switch(sc){ case 0: case 1: case 2: case 3: case 4: case 5: System.out.println("等级是E等"); break; case 6: System.out.println("等级是D等"); break; case 7: System.out.println("等级是C等"); break; case 8: System.out.println("等级是B等"); break; case 9: case 10: System.out.println("等级是A等"); break; default: break; }
2.分析以下需求,并用代码实现:
(1)根据工龄(整数)给员工涨工资(整数),工龄和基本工资通过键盘录入
(2)涨工资的条件如下:
[10-15) +5000
[5-10) +2500
[3~5) +1000
[1~3) +500
[0~1) +200
(3)如果用户输入的工龄为10,基本工资为3000,程序运行后打印格式"您目前工作了10年,基本工资为 3000元, 应涨工资 5000
元,涨后工资 8000元"
//第二题 Scanner shuru=new Scanner(System.in); int age=shuru.nextInt(); int money=shuru.nextInt(); switch(age){ case 0: System.out.println("您目前工作了"+age+"年,基本工资为"+money+"元,应涨工资200元,涨后工资"+(money+200)+"元"); break; case 1: case 2: System.out.println("您目前工作了"+age+"年,基本工资为"+money+"元,应涨工资500元,涨后工资"+(money+500)+"元"); break; case 3: case 4: System.out.println("您目前工作了"+age+"年,基本工资为"+money+"元,应涨工资1000元,涨后工资"+(money+1000)+"元"); break; case 5: case 6: case 7: case 8: case 9: System.out.println("您目前工作了"+age+"年,基本工资为"+money+"元,应涨工资2500元,涨后工资"+(money+2500)+"元"); break; case 10: case 11: case 12: case 13: case 14: System.out.println("您目前工作了"+age+"年,基本工资为"+money+"元,应涨工资5000元,涨后工资"+(money+5000)+"元"); break; default: break; }