Java学习笔记2.6.1 数组 - 一维数组
Posted howard2005
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java学习笔记2.6.1 数组 - 一维数组相关的知识,希望对你有一定的参考价值。
文章目录
- 零、本讲学习目标
- 一、引入数组
- 二、了解数组
- 三、初探一维数组
- 三、数组常见操作
- 四、课后作业
零、本讲学习目标
- 理解为何要引入数组
- 了解数组的分类
- 掌握一维数组遍历
- 掌握求一维数组最值
- 掌握一维数组排序
一、引入数组
(一)假设场景
- 现在需要统计某公司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, long | 0 |
float, double | 0.0 |
char | 一个空字符,即’\\u0000’ |
boolean | false |
引用数据类型 | 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语言学习笔记 — 基础 — 高级数据类型 — 数据容器 — 数组:一维数组