本章主要讲数组(Array),数组的本质是对象。
一、概述
1.1 数组的产生缘由
生活场景:解决一个班级30名学生的成绩排序问题:
如果用以前的变量,就要定义30个变量来存储上述数据:stu1、stu2、stu3...stu30
,很麻烦。
此时,数组应运而生。
1.2 概念
数组:相同类型的数据,按照顺序,组成的一种引用数据类型。
1.3 主要知识点
一维数组的六个方面:
- 声明
- 创建
- 初始化
- 元素的引用
- 长度
- 数组的应用
二维数组因为是特殊的一维数组,所以内容同上。
二、一维数组的五个内容
2.1 声明
声明的语法格式:
- 以前变量的声明语法格式:数据类型 变量名;
例如:int n;
、int myInt
- 数组的声明语法格式:数据类型[] 数组名;
例如,int[] myIntArray;
、char[] ch;
、String[] strArray;
在命名规则上,数组名跟变量名是一致的。
其中,字符串本身是个类,最后那个
String[] strArray;
也叫对象数组。其他语言,如C语言、C++是这么声明的:数据类型 数组名[]。Java也可以,为有区分度,不建议这么命名。
2.2 创建
1.形式1:先声明,后创建
数据类型[] 数组名;
数组名 = new 数据类型[数组长度];
int[] arr; // 先声明,后创建
arr=new int[10]; // 创建一个长度为10的整型数组
2.形式2:声明的同时,创建数组
数据类型[] 数组名 = new 数据类型[数组长度];
int[] arr=new int[10]; // 声明、创建,一行搞定
数组创建时,必须指定数组的长度。
3.数组在内存中的存储
数组的特点是:分配连续的内存空间。
数组本质是个对象,所以存储的时候是有默认值的,为0;
相比较,之前的局部变量存储是没有默认值的,没赋值就是没有值。
2.3 数组的初始化
数组的声明+给数组赋值=数组的初始化。
int[] arr={1,2,3,4,5,6,7,8,9,10}; // 数组的长度:初始化时数组元素的个数
之前的数组创建,只是建了个有10个苹果存放位置的空仓库,默认放点空草,苹果都没往里面存。
2.4 数组元素的引用(表示)
数组名[下标]
下标是从0开始的。
int[] a={1,2,3,4,5,6,7,8,9,10};
2.5 数组的长度
即数组中元素的个数。用属性length
表示,即:a.length
三、一维数组的应用
3.1 程序实现
不同数据类型的数组的默认值比较:
package com.imooc.array;
public class ArrayDemo {
public static void main(String[] args) {
// 声明一个整型数组
int[] intArray;
// 声明一个字符串类型的数组
String strArray[]; // 尽可能写上面的形式
// 创建数组
intArray=new int[5];
strArray=new String[10];
// 声明数组,同时进行创建
float[] floatArray=new float[4];
// 初始化数组
char[] ch= {'a','b','c','d'};
System.out.println("ch数组的长度为:"+ch.length);
System.out.println("intArray数组的第2个元素为:"+intArray[1]);
System.out.println("flaotArray数组的最后一个元素为:"+floatArray[floatArray.length-1]);
System.out.println("strArray数组的第5个元素为:"+strArray[4]);
}
}
-->
ch数组的长度为:4
intArray数组的第2个元素为:0 // 一般的数组创建时,元素默认是0
flaotArray数组的最后一个元素为:0.0
strArray数组的第5个元素为:null // 所有的对象数组创建时,元素默认是空值null
3.2 用循环去操作数组
package com.imooc.array;
public class ArrayDemo {
public static void main(String[] args) {
// 循环输入,为整型数组赋值
for(int i=0;i<5;i++){ // 中间没有冒号;,但要有大括号{}!
intArray[i]=i+1;
}
// 循环输出,整型数组中的元素;
System.out.println("整型数组intArray的元素为:");
for(int i=0;i<=5;i++){ // 应该改为i<5
System.out.print(intArray[i]+" "); // 由上可知,i只能取0,1,2,3,4,压根儿就没有5
}
}
}
--->
整型数组intArray的元素为:
1 2 3 4 5 // 下面是“数组下标越界”的异常
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 5 out of bounds for length 5 at com.imooc.array.ArrayDemo.main(ArrayDemo.java:13)
3.3 案例应用1
求整型数组的累加和?
- 演示下如何从键盘接受数据,为数组元素赋值
- 并且求它的累加和
package com.imooc.array;
import java.util.Scanner;
public class ArrayDemo1 {
public static void main(String[] args) {
// 定义整型数组
int[] a=new int[5];
// 从键盘接受数据,为数组元素赋值
Scanner sc=new Scanner(System.in);
for(int i=0;i<a.length;i++){
System.out.println("请输入第"+(i+1)+"个元素:");
a[i]=sc.nextInt();
}
// 检验下有没有真的存进数组元素
System.out.println("数组元素的内容为:");
for(int i=0;i<a.length;i++) {
System.out.print(a[i]+" ");
}
// 求数组元素的累加和
int sum=0;
for(int i=0;i<a.length;i++) {
sum=sum+a[i]; // i=1时的初始sum,是上个循环i=0时的结果sum
}
System.out.println();
System.out.println("数组元素的累加和为:"+sum);
}
}
--->
请输入第1个元素:
1
请输入第2个元素:
3
请输入第3个元素:
5
请输入第4个元素:
7
请输入第5个元素:
9
数组元素的内容为:
1 3 5 7 9
数组元素的累加和为:25
3.4 案例应用2
以前,我们求过两个元素的最大值。那么,对于有多个元素的数组,该如何求呢?
package com.imooc.array;
public class ArrayDemo2 {
public static void main(String[] args) {
int[] a={34,23,78,56,31};
int max=a[0]; // 定义一个变量,用于存放最大值 // 并假设当前,最大值为数组第一个元素
for(int i=1;i<a.length;i++){
if(max<a[i]) {
max=a[i]; // 总是保证,max变量中存放的都是最大值
}
}
System.out.println("数组元素的最大值为:"+max);
}
}
--->
数组元素的最大值为:78
执行流程:
上述是最大值的求法,其实最小值原理同上。
你比我强,那么我就学习你优点,然后成为你。择其善者而从之
四、增强型for循环
用途:作为一种简洁的for循环结构,增强型for循环如果与本章学习的数组结合,那么可以更放方便的操作数据。
增强型for循环在以后的集合中,也大有用处。
4.1 概念
增强型for循环又叫foreach
循环。
作用原理:把数组中的每个元素,依次存放到变量n中,然后依次输出。本质:遍历。
同一般的for循环比较,它没有了三个表达式。所以,表面上虽没有终止条件,但是其隐含的终止条件其实是只要遍历完数组元素,就结束。
int[] arr={1,2,3,4,5};
for(int n:arr){ // 把数组arr中的每个元素依次放进变量n中
System.out.println(n);
}
4.2 案例应用
package com.imooc.array;
import java.util.Scanner;
public class ArrayDemo1 {
public static void main(String[] args) {
// 定义整型数组
int[] a=new int[5];
// 从键盘接受数据,为数组元素赋值
Scanner sc=new Scanner(System.in);
for(int i=0;i<a.length;i++){
System.out.println("请输入第"+(i+1)+"个元素:");
a[i]=sc.nextInt();
}
// 检验下有没有存进数组元素
System.out.println("数组元素的内容为:");
for(int i=0;i<a.length;i++) { // 三个表达式
System.out.print(a[i]+" ");
}
// 用增强型for循环,输出数组内容
System.out.println();
System.out.println("使用增强型for循环,输出数组内容:");
for(int n:a) { // 简洁
System.out.print(n+" ");
}
}
}
--->
请输入第1个元素:
5
请输入第2个元素:
6
请输入第3个元素:
7
请输入第4个元素:
8
请输入第5个元素:
9
数组元素的内容为:
5 6 7 8 9
使用增强型for循环,输出数组内容: // 与普通for循环的结果一模一样
5 6 7 8 9
4.3 增强型for循环、普通for循环的区别
对比 | 增强型for循环 | 普通for循环 |
---|---|---|
特点 | 书写简洁 不需要有下标 | 永远要写三个表达式:循环变量、循环条件、循环变量的变化 必须有下标 |
使用场景 | 遍历数组或集合 | 在必须需要数组下标的场景: 比如,从键盘接受数组元素时,用下标提示输入第几个元素 |
4.4 铺垫:变量交换
如何对变量a、b的值进行交换?
int a=3,b=5;
int temp;
temp=a;
a=b;
b=temp;
五、冒泡排序
一种排序的算法。
5.1 概念
对一组整数,按照从小到大的顺序,进行排序。
5.2 执行流程
就像水泡从水底一点一点上浮。
5.3 案例应用
package com.imooc.array;
public class SortDemo {
public static void main(String[] args) {
// 冒泡排序
int[] a= {34,53,12,32,56,17};
// 看下排序前的数组元素
System.out.println("排序前的数组元素为:");
for(int n:a) { // 增强型for循环
System.out.print(n+" ");
}
System.out.println();
// 开始排序
int temp;
for(int i=0;i<a.length;i++) { // 外重循环控制多少趟
for(int j=0;j<a.length-1-i;j++) { // 内重循环控制每趟排序的次数
if(a[j]>a[j+1]) { // 如果左边元素大,那么它就代替右边元素:互换变量
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}
}
}
// 看下排序后的数组元素
System.out.println("从小到大排序后的数组元素为:");
for(int n:a) { // 增强型for循环
System.out.print(n+" ");
}
}
}
--->
排序前的数组元素为:
34 53 12 32 56 17
从小到大排序后的数组元素为:
12 17 32 34 53 56
上述是由小到大排序,每一次比较,把最大值放到数组元素的末尾。
如果是由大到小排序,那么每一次比较,就是把最小值放到数组元素的末尾。
5.4 课后题思考
思考题1:
为什么下面得不出4?[22.7.12]:因为判断条件中的或语句写错了!应该是if(a[i]=='A'|a[i]=='a'){n++;}
。
然而,下图得出为4。
5.5 旅游度假问题
任务描述:某公司打算安排员工旅游度假,但是目的地未定,请你提供5个旅游目的地供参考,并随机选择一个旅游目的地?
1.效果图:
2.任务提示:
1、使用的技术点:数组、循环、键盘输入数据、随机数
2、输入的地点都放到数组中
3、生成随机数,根据随机数输出数组元素,注意随机数的范围
与以往题目不同,这个题目并没有给小伙伴展示详细思路,希望小伙伴根据提示进行思考,这也是一个锻炼的过程呦~
3.代码如下:
关于生成随机数,利用方法Math.random()表示[0,1)
的特性:
Math.random()-----------[0,1)之间的随机数,包括浮点数和整型
Math.random()*10--------[0,10)之间的随机数,包括浮点数和整型
Math.random()*10+1------[1,11)之间的随机数,包括浮点数和整型
package com.imooc.array;
import java.util.Scanner;
public class TravelTest {
public static void main(String[] args) {
//创建一个字符串数组,存放旅游城市
String[] city=new String[5]; // 注意:这里是字符串数据类型String,不是int!
// 键盘输入数据
Scanner sc=new Scanner(System.in);
for(int i=0;i<city.length;i++) {
System.out.println("请输入第"+(i+1)+"个旅游目的地:"); // i是下标,从0开始,对应的正是第1个城市
city[i]=sc.next();
}
// 展示供参考的旅游目的地
System.out.println("以下地方供旅游参考:");
for(String n:city) { // 增强型for循环,简洁好用
System.out.print(n+" ");
}
System.out.println();
// 生成随机数,根据随机数输出数组元素,注意随机数的范围
System.out.println("随机生成的旅游目的地:");
int number=(int)((Math.random()*10))/2;
System.out.println("number="+number);
System.out.println(city[number]);
}
}
--->
请输入第1个旅游目的地:
北京
请输入第2个旅游目的地:
海南
请输入第3个旅游目的地:
杭州
请输入第4个旅游目的地:
上海
请输入第5个旅游目的地:
哈尔滨
以下地方供旅游参考:
北京 海南 杭州 上海 哈尔滨
随机生成的旅游目的地:
number=3
上海
六、二维数组的应用
6.1 概念
二维数组跟上述的一维数组很像,可以看成多个一维数组组成的内容。
6.2 二维数组的声明、创建
1.二维数组的声明的三种形式
int[][] intArray; // 声明int类型的二维数组
float floatArray[][]; // 声明float类型的二维数组
double[] doubleArray[]; // 声明double类型的二维数组
2.二维数组的应用场景:
二维数组可以看作是几行几列的表格,即表示二维表格中的数据。
查看二维数组创建后的默认元素,以及赋值后的元素。
package com.imooc.array;
public class ArrayDemo5 {
public static void main(String[] args) {
// 创建一个三行三列的int类型的数组(表格)
intArray=new int[3][3];
System.out.println("intArray二维数组的第3行第2列的元素为:"+intArray[2][1]); // 查看默认元素
// 为第2行第3个元素赋值为9
intArray[1][2]=9;
System.out.println("赋值后,intArray二维数组的第2行第3列的元素为:"+intArray[1][2]);
}
}
--->
intArray二维数组的第3行第2列的元素为:0
赋值后,intArray二维数组的第2行第3列的元素为:9
3.异常:空指针异常
package com.imooc.array;
public class ArrayDemo5 {
public static void main(String[] args) {
float floatArray[][]; // 声明float类型的二维数组
// 创建float类型的数组时,只指定行数,是正确的。但是只指定列数是报错的
floatArray=new float[3][];
System.out.println(floatArray[0][0]); // 既然只有行,没有列,那么第1行1列元素是什么?
}
}
---> // 空指针 异常,第1行1列压根儿没元素啊!
Exception in thread "main" java.lang.NullPointerException: Cannot load from float array because "floatArray[0]" is null at com.imooc.array.ArrayDemo5.main(ArrayDemo5.java:8)
4.异常:数组下标越界
package com.imooc.array;
public class ArrayDemo5 {
public static void main(String[] args) {
float floatArray[][]; // 声明float类型的二维数组
floatArray=new float[3][]; // 创建数组的三行
// 每行相当于一个一维数组,需要创建
floatArray[0]=new float[3]; // 第一行有三列,共3个元素!
floatArray[1]=new float[4]; // 第一行有四列
floatArray[2]=new float[5]; // 第一行有五列
System.out.println(floatArray[0][0]); // 默认值是多少?
System.out.println(floatArray[0][3]); // 检验下第一行第4个元素有没有啊?
}
}
---》
0.0 // 下面的异常:数组下标越界
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 3 out of bounds for length 3 at com.imooc.array.ArrayDemo5.main(ArrayDemo5.java:31)
创建数组时,因为相当于创建表格,所以
intArray=new int[3][3];
相当于创建一个三行三列表格。对于数组元素引用,因为元素的下标位置是从0开始,所以引用元素时,下标值是该元素从起点起数过来的元素数量减一。
6.3 初始化、引用
1.普通的二维数组、列数不同的二维数组的初始化
package com.imooc.array;
public class ArrayDemo5 {
public static void main(String[] args) {
// 二维数组的初始化
int[][] num={{1,2,3},{4,5,6},{7,8,9}}; // 三行三列的数组
System.out.println("num数组的第1行第2列的元素为:"+num[0][1]);
System.out.println("num数组的行数为:"+num.length);
System.out.println("num数组的列数为:"+num[0].length);
// 列数不同的二维数组的初始化
int[][] num1={{78,98},{65,75,63},{98}}; // 三行数组,但各行的列数均不同
System.out.println("num数组的第1行的列数为:"+num1[0].length);
}
}
--->
num数组的第1行第2列的元素为:2
num数组的行数为:3
num数组的列数为:3
num数组的第1行的列数为:2
2.二维数组与双重循环:
package com.imooc.array;
public class ArrayDemo5 {
public static void main(String[] args) {
int[][] num1={{78,98},{65,75,63},{98}};
// 循环输出二维数组的内容
for(int i=0;i<num1.length;i++) { // 外重循环控制行数
for(int j=0;j<num1[i].length;j++) { // 内重循环控制列数
System.out.print(num1[i][j]+" ");
}
System.out.println();
}
}
}
--->
78 98
65 75 63
98
6.4 案例应用
package com.imooc.array;
import java.util.Scanner;
public class ScoreDemo {
public static void main(String[] args) {
// 定义一个三行两列的整型二维数组intArray
int[][] intArray;
intArray = new int[3][2];
// 从键盘输入学生成绩,要求输入顺序与效果图一致
Scanner sc = new Scanner(System.in);
for (int i = 0; i < intArray.length; i++) {
for (int j = 0; j < intArray[i].length; j++) {
if (j == 1) {
System.out.println("请输入第" + (i+1) + "个学生的数学成绩:");
}
else {
System.out.println("请输入第" + (i+1) + "个学生的语文成绩:");
}
intArray[i][j] = sc.nextInt();
}
}
// 求语文的总成绩和平均分
int sum1 = 0;
for (int i = 0; i < intArray.length; i++) {
sum1 += intArray[i][0];
}
System.out.println("语文的总成绩为:"+sum1);
int avr1 = sum1 / intArray.length;
System.out.println("语文的平均分为:"+avr1);
// 求数学的总成绩和平均分
int sum2 = 0;
for (int i = 0; i < intArray.length; i++) {
sum2 += intArray[i][1];
}
System.out.println("数学的总成绩为:"+sum2);
int avr2 = sum2 / intArray.length;
System.out.println("数学的平均分为:"+avr2);
}
}
--->
请输入第1个学生的语文成绩:
78
请输入第1个学生的数学成绩:
98
请输入第2个学生的语文成绩:
95
请输入第2个学生的数学成绩:
100
请输入第3个学生的语文成绩:
75
请输入第3个学生的数学成绩:
80
语文的总成绩为:248
语文的平均分为:82
数学的总成绩为:278
数学的平均分为:92
Comments | NOTHING