第四章 数组
学习目标
- 了解数据概念
- 数组创建
- 从数组中存取数据
- 遍历数组
- 数组中元素的默认值
- 数组内存分析
- 多维数组
- 数组练习
1.数组概念
一组相同类型数据的容器。
- 相同类型:Java语言要求存入数组的数据类型必须一致
- 容器:类似于生活中存放物品的容器,在编程的世界中,『容器』可以用来存放数据
- 一组:容器中可以存放多个数据
2.声明数组变量
int[] ageArray; String[] nameArray; double salaryArray [];
虽然[]也可以放在变量名的后面,但是还是建议放在类型的后面。
// 声明数组时不能在方括号中指定数组长度 char[5] tipArray;
3.创建数组对象
3.1 指定长度创建数组
int[] ageArray = new int[5];
3.2 直接赋值创建数组
此时[]中不能写数组指定长度
String nameArray = new String[]{"foo", "bar", "biz"}; //此时的长度就是3
也可以这么写:
int[] numberArray = {5, 7, 11, 13, 17, 19}; //后面的{}就是一个对象
4.将数据存入数组
String nameArray = new String[3]; int[] numberArray = new int[5]; ageArray[0] = 10; ageArray[1] = 11; ageArray[2] = 12; ageArray[3] = 13; ageArray[4] = 14; nameArray[0] = "aaa"; nameArray[1] = "bbb"; nameArray[2] = "ccc";
5.从数组中读取数据
System.out.println("ageArray[0] = " + ageArray[0]); System.out.println("ageArray[1] = " + ageArray[1]); System.out.println("ageArray[2] = " + ageArray[2]); System.out.println("ageArray[3] = " + ageArray[3]); System.out.println("ageArray[4] = " + ageArray[4]); System.out.println("nameArray[0] = " + nameArray[0]); System.out.println("nameArray[1] = " + nameArray[1]); System.out.println("nameArray[2] = " + nameArray[2]);
6.遍历数组
// 6.遍历数组(通过循环依次读取数组中的每一个值) // 遍历数组的起点:数组下标0 // 遍历数组的终点:数组长度-1 for (int i = 0; i < ageArray.length; i++) { // 在遍历过程中,使用i作为数组下标访问每一个数组元素 int age = ageArray[i]; System.out.println("age = " + age); }
注:生成遍历数组的for循环模板的快捷键是数组变量名.fori
7.数组必须创建对象在访问元素
8.数组中元素默认值
9.内存分析
9.1 声明基本数据类型变量
int a = 10;
9.2 创建对象
Scanner scanner = new Scanner(System.in);
9.3 创建数组对象
9.4 将数据写入数组
ageArray[1] = 5;
9.5 多声明一个数组变量
9.6 通过另一个变量访问数组元素
otherArray[2] = 14
9.7 数组变量指向新数组
otherArray = new int[2];
9.8 给新数组元素赋值
otherArray[1] = 33;
10.多维数组
10.1 多维数组概念
从逻辑角度出发
(1)一维数组
一维数组是线性的结构,通俗来说就是一条线
(2)二维数组
二维数组通俗来说就是一个面
(3)三维数组
三维数组就是一个立体的空间结构了
10.2 多维数组的底层内存存储结构
10.3 多维数组的语法层面
(1)创建二维数组格式一
// 格式1:动态初始化——创建数组对象时就指定了两个维度的数组长度 int[][] arr2d01 = new int[3][2]; arr2d01[0][0] = 100; arr2d01[0][1] = 101; arr2d01[1][0] = 102; arr2d01[1][1] = 103; arr2d01[2][0] = 104; arr2d01[2][1] = 105;
(2)创建二维数组格式二
// 格式2:动态初始化——仅指定第一个维度的数组长度 int[][] arr2d02 = new int[3][]; // Java中多维数组不必都是规则矩阵形式 arr2d02[0] = new int[]{3, 5, 7}; arr2d02[1] = new int[]{14, 21, 66, 89}; arr2d02[2] = new int[]{90, 100};
注:C语言中的多维数组创建就不能用这种方式创建,例如C语言的二维数组就一定要指定列的大小,才会自动生产多少行。Java的二维数组可以不是规则矩阵形式。
(3)创建二维数组格式三
// 格式3:静态初始化——在创建对象时将数据填充 // 此时如果某个元素位置设置为null不会编译报错,但是访问这个位置时还是要先初始化 int[][] arr2d03 = new int[][]{{1,2,3}, {4,5}, null, {6,7,8}}; // 前面设置null的地方,需要初始化才可以访问 arr2d03[2] = new int[]{12,24}; arr2d03[2][0] = 5;
(4)创建二维数组格式四【不建议】
// 格式4:声明变量时,两层[]没在一起 int[] x[] = new int[][]{{1,2,3}, {4,5}, {6,7,8}};
10.4 访问二维数组
// 二、访问二维数组元素(读、写) int[][] arr2d05 = new int[2][2]; // 向数组元素写入数据 arr2d05[1][0] = 10; // 读取数组元素 System.out.println("arr2d05[1][0] = " + arr2d05[1][0]);
10.5 遍历二维数组
// 三、遍历二维数组:需要使用双层嵌套的循环 int[][] arr2d06 = new int[][]{{1,2,3},{4,5,6},{7,8,9}}; // 先遍历第一个维度:取出每一个一维数组 for (int i = 0; i < arr2d06.length; i++) { int[] intArr = arr2d06[i]; for (int j = 0; j < intArr.length; j++) { int intValue = intArr[j]; System.out.println("intValue["+i+"]["+j+"] = " + intValue); } }
11.数组练习
练习1
升景坊单间短期出租4个月,550元/月(水电煤公摊,网费35元/月),空调、卫生间、厨房齐全。屋内均是IT行业人士,喜欢安静。所以要求来租者最好是同行或者刚毕业的年轻人,爱干净、安静。第一个数组的数组元素{2,0,3,2,4,0,1,3,2,3,3}是第二个数组的下标,第二个数组是{8,2,1,0,3},第二数组根据第一数组的元素挨个取出元素,组合起来就是房东的电话,该题求房东的电话号码。
public class ArrayTest { public static void main(String[] args) { /* * 解题思路:建立两个数组,根据提示取出数组元素, * 用加号连起来就是电话号码的字符串 * */ String s = ""; int[] array1 = new int[]{8,2,1,0,3}; int[] ints = new int[]{2, 0, 3, 2, 4, 0, 1, 3, 2, 3, 3}; for (int i = 0; i < ints.length; i++) { s += array1[ints[i]]; } System.out.println("房东的电话号码为:"+s); } }
练习2
分析以下需求,并用代码实现:
(1)在编程竞赛中,有10位评委为参赛的选手打分,分数分别为:5,4,6,8,9,0,1,2,7,3
(2)求选手的最后得分(去掉一个最高分和一个最低分后其余8位评委打分的平均值)
public class ArrayTest { public static void main(String[] args) { /* * 解题思路:要有两个循环,第一个循环求出最大值和最小值, * 第二个循环求出总和,然后除以8即可。 * */ int[] ints = {5, 4, 6, 8, 9, 0, 1, 2, 7, 3}; int max = ints[0]; int min = ints[0]; int score = 0; int sum = 0; for (int i = 1; i < ints.length; i++) { score = ints[i]; if(score>max){ max = score; }else if (score < min){ min = score; } } for (int i = 0; i < ints.length; i++) { sum += ints[i]; } double average = (sum - min - max)/8.0; System.out.println("average = "+average); } }
练习3
用一个数组,保存星期一到星期天的7个英语单词,从键盘输入1-7,显示对应的单词
中文 | 英文 |
星期一 | Monday |
星期二 | Tuesday |
星期三 | Wednesday |
星期四 | Thursday |
星期五 | Friday |
星期六 | Saturday |
星期日 | Sunday |
public class ArrayTest { public static void main(String[] args) { String[] strings = {"星期一", "星期二", "星期三", "星期四", "星期五", "星期六", "星期日"}; Scanner scanner = new Scanner(System.in); int num = scanner.nextInt(); System.out.println(strings[num - 1]); } }
练习4
用一个数组存储26个英文字母的小写形式,并遍历显示小写字母以及它对应的大写字母,例如:a->A
提示:ASCII码表
public class ArrayTest { public static void main(String[] args) { char[] chars = new char[26]; for (int i = 0; i < 26; i++) { chars[i] = (char)('a' + i); } for (int i = 0; i < chars.length; i++) { System.out.println((char)(chars[i] - 32)); } } }
练习5
public class ArrayTest { public static void main(String[] args) { int[][] ints = new int[10][]; for (int i = 0; i < 10; i++) { ints[i] = new int[i+1]; ints[i][0] = 1; ints[i][i] = 1; for (int j = 1; j < i; j++) { ints[i][j] = ints[i-1][j-1]+ints[i-1][j]; } } for (int i = 0; i < 10; i++) { for (int j = 0; j < i + 1; j++) { System.out.print(ints[i][j]+"\t"); } System.out.println(); } } }
12.数组工具类Arrays
用法举例:
// 1.创建一个数组对象 int[] toBeSortedArr = {22, 33, 5, 7, 2, -6, 13, 99, 82}; // 2.调用工具类的工具方法对上面数组进行排序 // 类名.方法名(传入参数) Arrays.sort(toBeSortedArr); // 3.遍历数组 for (int i = 0; i < toBeSortedArr.length; i++) { int value = toBeSortedArr[i]; System.out.println("value = " + value); }
13.数组使用中常见的异常
13.1 数组下标越界异常
// 1.数组下标越界异常 int[] intArr = new int[5]; // java.lang.ArrayIndexOutOfBoundsException // intArr[80] = 5; // java.lang.ArrayIndexOutOfBoundsException // System.out.println("intArr[5] = " + intArr[5]);
13.2 空指针异常
// 2.空指针异常 // java.lang.NullPointerException char[] charArr = null; System.out.println("charArr[0] = " + charArr[0]);