Java学习笔记2.6.1 数组 - 一维数组

Posted howard2005

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习笔记2.6.1 数组 - 一维数组相关的知识,希望对你有一定的参考价值。

文章目录

零、本讲学习目标

  1. 理解为何要引入数组
  2. 了解数组的分类
  3. 掌握一维数组遍历
  4. 掌握求一维数组最值
  5. 掌握一维数组排序

一、引入数组

(一)假设场景

  • 现在需要统计某公司100名员工的工资情况,例如计算平均工资、最高工资等。

(二)笨拙的办法

  • 利用前面所学的知识,程序就需要声明100个变量(salary1, salary2, …, salary100),来分别记住每位员工的工资,这样做的话,显得非常麻烦。
  • a v e r a g e = s a l a r y 1 + s a l a r y 2 + . . . + s a l a r y 100 100 average=\\displaystyle\\fracsalary1+salary2+...+salary100100 average=100salary1+salary2+...+salary100

(三)优化的办法

  • 可以使用一个数组来记住这100名员工的工资(salary[0], salary[1], …, salary[99]),然后对数组的元素进行操作。
double sum = 0;
double average;
double[] salary[100];
....
for (int i = 0; i < 100; i++) 
    sum = sum + salary[i];
 
average = sum / 100;
  • 问:程序里为什么要使用数组?
  • 答:为了更方便地处理批量数据。

二、了解数组

(一)数组概念

  • 数组是指一组数据的集合,数组中的每个数据被称作元素。在数组中可以存放任意类型的元素,但同一个数组里存放的元素类型必须一致,因为Java是静态类型语言。Python是动态类型语言,列表里存放的元素类型可以不同。
  • 定义Java数组,必须指定数组元素类型以及长度(包含多少个数组元素)

(二)数组分类

  • 数组可以分为一维数组和多维数组(最常见的是二维数组)。
  • 一维数组只有一个下标,表示数组元素在数组里的位置
  • 二维数组有两个下标,一个下标表示数组元素在数组的行位置,一般叫做行标;一个下标表示数组元素在数组的列位置,一般叫做列标。

三、初探一维数组

(一)一维数组定义

1、语法格式

数组类型[] 数组名 = new 数组类型[数组长度];   
数组类型[] 数组名 = new 数组类型[]数组元素0, 数组元素1, ...;  
数组类型[] 数组名 = 数组元素0, 数组元素1, ...; 

2、数组定义示例

int[] ids = new int[100];
String[] names = new String[] "洪艳林", "陈燕文", "郑晓琳", "唐竹龙";
Object[] student = 1, "张三丰", "男", 20, "15892924560", "maths007@163.com";

3、数组定义的内存变化图

  • 声明数组变量,此时数组变量还是null,赋值实例化数组之后,才会给它分配内存空间

(二)演示三种数组定义方式

package net.hw.lesson08;

/**
 * 功能:三种方式定义数组
 * 作者:华卫
 * 日期:2020年4月19日
 */
public class Example801 
    public static void main(String[] args) 
        // 1. 第一种方式定义数组
        int[] ids = new int[100];
        // 输出整个数组
        System.out.println("ids = " + ids);
        // 输出数组第一个元素
        System.out.println("ids[0] = " + ids[0]);
        // 输出数组最后一个元素
        System.out.println("ids[99] = " + ids[99]);

        // 2. 第二种方式定义数组
        String[] names = new String[] "洪艳林", "陈燕文", "郑晓琳", "唐竹龙";
        // 输出整个数组
        System.out.println("names = " + names);
        // 输出数组第一个元素
        System.out.println("names[0] = " + names[0]);
        // 输出数组最后一个元素
        System.out.println("names[3] = " + names[3]);
        
        // 3. 第三种方式定义数组
        Object[] objects = 1, "张三丰", "男", 20, "15892924560", "maths007@163.com";
        // 输出整个数组
        System.out.println("objects = " + objects);
        // 输出数组的长度
        System.out.println("数组长度 = " + objects.length);
        // 输出数组第一个元素
        System.out.println("objects[0] = " + objects[0]);
        // 输出数组最后一个元素
        System.out.println("objects[" + (objects.length - 1) +"] = " + objects[objects.length - 1]);
    

  • 运行程序,查看结果

  • 直接打印数组变量,并不能输出数组里的数据,输出的是变量类型@哈希码。
    数组是一组相同类型的数据,有一个共同的名字,可以通过下标取访问每一个元素。

  • 注意,数组下标是从0开始的,对于上述定义的数组ids,长度是100,因此第一个元素时ids[0],最后一个元素是ids[99],访问ids[100]是要出错的,下标越界了。数组ids的长度,可以通过其length属性获取。

  • 第二种数组定义方式,可以再次对数组变量赋值,增删元素

names = new String[] "洪艳林", "陈燕文", "郑晓琳", "唐竹龙", "张三丰";
  • 但是第三种数组定义方式,就不能再次对数组变量赋值,程序编译是要报错
objects = 1, "张三丰", "男", 20, "15892924560", "maths007@163.com", "泸州职业技术学院";
  • 关于第三种方式定义数组,可以对照一下Python的列表操作
  • 第一种定义数组方式,定义的整型数组,并没有给元素赋初值,默认值是0,当然不同类型数组元素的初始值并不相同。

(三)数组元素默认初始值

1、不同类型数组元素默认初始值

数据类型默认初始值
byte, short, int, long0
float, double0.0
char一个空字符,即’\\u0000’
booleanfalse
引用数据类型null,表示变量不引用任何对象

2、案例演示不同类型数组元素默认值

package net.hw.lesson08;

/**
 * 功能:演示不同类型数组元素的默认值
 * 作者:华卫
 * 日期:2020年4月19日
 */
public class Example802 
    public static void main(String[] args) 
        byte[] bytes = new byte[10];
        System.out.println("byte类型数组元素的默认值:" + bytes[0]);

        short[] shorts = new short[10];
        System.out.println("short类型数组元素的默认值:" + shorts[0]);

        int[] ints = new int[10];
        System.out.println("int类型数组元素的默认值:" + ints[0]);

        long[] longs = new long[10];
        System.out.println("long类型数组元素的默认值:" + longs[0]);

        float[] floats = new float[10];
        System.out.println("float类型数组元素的默认值:" + floats[0]);

        double[] doubles = new double[10];
        System.out.println("double类型数组元素的默认值:" + doubles[0]);

        char[] chars = new char[10];
        System.out.println("char类型数组元素的默认值:" + chars[0]);

        boolean[] booleans = new boolean[10];
        System.out.println("boolean类型数组元素的默认值:" + booleans[0]);

        String[] strings = new String[10];
        System.out.println("String类型数组元素的默认值:" + strings[0]);
    

  • 运行程序,查看结果
  • 在使用数组时,如果不想使用这些默认初始值,可以显式地为这些元素赋值,当然也可以对定义数组时的指定初始值进行修改。

(四)给数组元素赋值

  • 给数组元素赋初值或修改数组元素已有值
package net.hw.lesson08;

/**
 * 功能:演示给数组元素赋值
 * 作者:华卫
 * 日期:2020年4月24日
 */
public class Example803 
    public static void main(String[] args) 
        // 1. 第一种方式定义数组
        int[] ids = new int[100];
        // 输出数组第一个元素
        System.out.println("ids[0] = " + ids[0]);
        // 给数组第一个元素赋值进行初始化
        ids[0] = 1000;
        // 再次输出数组第一个元素
        System.out.println("ids[0] = " + ids[0]);

        // 2. 第二种方式定义数组
        String[] names = new String[] "洪艳林", "陈燕文", "郑晓琳", "唐竹龙";
        // 输出数组第一个元素
        System.out.println("names[0] = " + names[0]);
        // 修改数组第一个元素的值
        names[0] = "张三丰";
        // 再次输出数组第一个元素
        System.out.println("names[0] = " + names[0]);

        // 3. 第三种方式定义数组
        Object[] objects = 1, "张三丰", "男", 20, "15892924560", "maths007@163.com";
        // 输出数组第一个元素
        System.out.println("objects[0] = " + objects[0]);
        // 修改数组第一个元素的值
        objects[0] = 903213;
        // 再次输出数组第一个元素
        System.out.println("objects[0] = " + objects[0]);
    

  • 运行程序,查看结果

  • 无论是给数组元素赋初值,还是修改数组元素的值,格式都一样:数组名[下标] = 元素值

  • 对照一下Python类修改列表的元素值

(五)数组使用注意事项

1、避免数组下标越界异常

  • 每个数组的索引(下标)都有一个范围,即0~length-1。在访问数组的元素时,索引不能超出这个范围,否则程序会报错(ArrayIndexOutOfBoundsException,即数组角标越界异常)。

2、避免数组空指针异常

  • 在使用变量引用一个数组时,变量必须指向一个有效的数组对象,如果该变量的值为null,则意味着没有指向任何数组,此时通过该变量访问数组的元素会出现错误(NullPointerException,即空指针异常)。

三、数组常见操作

  • 在程序开发中,数组的应用非常广泛,灵活地使用数组对实际开发很重要。下面详细讲解数组的常见操作:数组的遍历、最值的获取、数组的排序……

(一)数组遍历

1、数组遍历概念

  • 在操作数组时,经常需要依次访问数组中的每个元素,这种操作成为数组的遍历。利用while循环和for循环都可以实现数组的遍历,其中for循环,除了我们以前学习的for循环,还有一种增强for循环,或者叫foreach循环,是JDK1.5开始引入的一种循环方式。

2、案例演示

任务:统计10个学生的平均分

方法一、不采用数组完成任务
package net.hw.lesson08;

import java.util.Scanner;
/**
 * 功能:输入10个学生成绩,求平均分
 * 作者:华卫
 * 日期:2020年4月24日
 */
public class Example806 
    public static void main(String[] args) 
        // 声明部分       
        double score; // 学生成绩
        double sum = 0; // 总分
        double average; // 平均分
        final int N = 10; // 符号常量:学生人数
        Scanner sc = new Scanner(System.in);

        // 处理部分
       for (int i = 1; i <= N; i++)  
            System.out.print("输入第" + i + "个学生成绩:");
            score = sc.nextDouble();
            sum += score; // 累加语句         
        
        average = sum / N; // 计算平均分

        // 输出部分
        System.out.println(N + "个学生的平均分:" + average);
    

  • 运行程序,查看结果

  • 本例故意定义了一个符号常量N,用来保存学生人数,你觉得这样做有什么好处呢?

  • 不采用数组固然可以计算出10个学生的平均分,但是这个程序有很大的缺点,由于没有保存10个学生的成绩信息,以后要求10个学生的最高分或最低分,或者要给学生成绩排序,就没有办法完成。因为只有一个score简单变量,保存的是最后一个学生的成绩。

方法二、采用数组完成任务
package net.hw.lesson08;

import java.util.Scanner;
/**
 * 功能:输入10个学生成绩,求平均分
 * 作者:华卫
 * 日期:2020年4月24日
 */
public class Example806 
    public static void main(String[] args) 
        // 声明部分
        double[] scores = new double[10];
        double sum = 0, average;
        Scanner sc = new Scanner(System.in);

        // 输入部分
        for (int i = 0; i < scores.length; i++) 
            System.out.print("scores[" + i + "] = ");
            scores[i] = sc.nextDouble();
        

        // 处理部分
        for (int i = 0; i < scores.length; i++) 
            sum += scores[i];
        
        average = sum / scores.length; // 计算平均分

        // 输出部分
        System.out.println(scores.length + "个学生的平均分:" + average);
    

  • 运行程序,查看结果

  • 本例通过一个for循环实现了数组的遍历,累加求和,然后求均值。想一想,如何让平均分只保留两位小数。

  • 完成相同的任务,采用Python的代码

课堂练习:采用while循环求10个学生成绩平均分

(二)数组最值

1、数组最值概念

  • 在操作数组时,经常需要获取数组的最值:最小值和最大值,于是数组的范围:[最小值,最大值]。

2、案例演示

任务:求10个学生成绩最高分,并确定谁得了最高分

package net.hw.lesson08;

import java.util.Scanner;

/**
 * 功能:求10个学生成绩的最高分,
 *      并且确定是谁得了最高分。
 * 作者:华卫
 * 日期:2020年4月24日
 */
public class Example807 
    public static void main(String[] args) 
        // 声明部分
        int[] scores = new int[10]; // 成绩数组
        int maxScore; //最高分
        Scanner sc = new Scanner(System.in); // 扫描器

        // 输入部分
        for (int i = 0; i < scores.length; i++) 
            System.out.print("scores[" + i + "] = ")C语言学习笔记数组

指针与一维数组和二维数组以及字符串指针数组的学习笔记

go语言学习笔记 — 基础 — 高级数据类型 — 数据容器 — 数组:一维数组

Excel 公式学习笔记:数组用法

Java学习笔记之八java二维数组及其多维数组的内存应用拓展延伸

原Java学习笔记010 - 数组