2.2 Java数组



本章主要讲数组(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

七、总结

声明:Jerry's Blog|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 2.2 Java数组


Follow excellence, and success will chase you.