Java程序设计基础笔记 • 【第10章 数组】
全部章节 >>>>
本章目录
10.1 数组概述
10.1.1 数组优势
在超市的入口处,摆放着许多的电子储物柜,每个电子储物柜均由若干个储物箱构成,用于存放不同顾客的物品。
10.1.2 Java中的数组
数组是一个变量,用于将相同数据类型的数据存储在内存空间中,数组中的所有元素必须属于相同的数据类型。
数组为了在内存中能够存取多个数据更加方便,在设计数组时,数组的结构和基本要素都与生活中的电子储物柜非常类似。
数组的特点:
同一个数组中的数组元素必须具有相同的数据类型,且在内存中连续分布。
无论数组中包含多少个数组元素,该数组只存在一个名称,即数组名。
数组元素的编号称为下标,数组的下标从0 开始
可以通过“数组名[ 下标]”的方式访问数组中的任何元素。
数组的长度指数组可以存储元素的最大个数,在创建数组时确定
10.1.3 数组的分类
在Java语言中,存在多种形式的数组。
一维数组
多维数组
交错数组
10.2 一维数组
10.2.1 数组的定义和使用
在Java语言中,一维数组的使用类似于变量的使用,分为以下4个步骤:
- 声明数组
- 创建数组
- 初始化数组
- 引用数组元素
(1)声明数组:声明数组是使用数组的第一步,需要说明数组元素的类型以及数组的名称。
语法:
数据类型 [] 数组名 ; 或数据类型 数组名 [];
示例:
int[] age; // 用于存储年龄 String names[]; // 用于存储姓名
注意:
“[]”不能省略,且必须出现在数据类型与数组名之间。
在声明数组时,不能给定数组的长度。例如:“int [20] age; //错误”。
在Java中声明数组时,中括号可以放在数组名前后,一般我们习惯将中括号写在数据类型后。
(2)创建数组:在Java语言中,可以通过new 关键字创建数组,为数组分配内存空间。
语法:
数组名 = new 数据类型[数组长度];
示例:age = new int[10];
当然,也可以一步完成数组的声明与创建:
数据类型[] 数组名 = new 数据类型[数组长度];
示例:int[] age = new int[10];
(3)初始化数组: 在Java语言中,可以通过new 关键字创建数组,为数组分配内存空间。
创建后初始化:
int[] age = new int[10]; for (int i = 0; i < 10; i++) { age[i] = sc.nextInt(); }
创建时初始化:
int[] age = {17,16,18,21,24,22,21,19,20,17}; int[] age = new int[]{17,16,18,21,24,22,21,19,20,17};
默认值初始化:
数据类型
默认值
int
0
float
0.0f
double
0.0
boolean
false
char
‘\0’
(4)引用数组元素:
可以通过以下方式对数组中的元素进行存取(下标越界将会出现的错误)
语法:
数组名[下标]
数组可以使用length 属性在程序中动态获得数组的长度。
语法:
数组名.length
数组中第一个元素的下标:0
最后一个元素的下标:数组名.length-1
10.2.2 数组的使用案例
示例:输入本部门5位员工的薪资,并根据用户输入的序号为指定员工进行提薪。若用户输入序号出现越界,则提示错误。要求:薪资的涨幅不能超过原薪资的20%,若涨幅超过20%,则按照原薪资的20%进行提薪。
注意:
在程序中涉及到数组长度时,不建议直接使用数值常量5,而使用数组的length 属性动态获取数组长度。
当用户输入员工序号时,员工序号是1~5,而对应的数组元素下标是0~4,因此,对应数组元素的下标= 用户输入的员工序号-1。
import java.util.Scanner;
public class EmpSalaryDemo {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//使用数组储存5位员工的薪资
int[] salary = new int[5];
//用户输入的索引
int index;
//用户输入提升的薪资
int money;
//使用循环对数组中的每个元素进行赋值
System.out.println("请输入5位员工的薪资:");
for(int i = 0; i < salary.length; i++) {
salary[i] = sc.nextInt();
}
//用户输入的员工序号:1~5,而数组的中的下标:0~4
//员工序号-1:对应成绩在数组中的下标
System.out.println("请输入需要提薪的员工序号:");
index = sc.nextInt()-1;
System.out.println("请输入所提薪资:");
money = sc.nextInt();
//判断用户输入索引是否越界(0 ~ 长度 ~ -1)
if(index < 0 ||index > salary.length - 1) {
//出现下标越界,提示错误
System.out.println("输入的员工序号不存在,操作失败!");
}else {
//实现提薪的操作
//原工资的%20
int temp = (int)(salary[index]*0.2);
//若涨幅超过%20,则按照20%涨幅进行提薪
//否则按照实际输入的薪资进行提薪
if(money > temp) {
money = temp;
salary[index] += money;
}
System.out.println("提薪后工资:"+salary[index]);
}
}
}
10.2.3 实践练习
10.3 数组的应用(一)
10.3.1 遍历数组元素
示例:编写JAVA程序,输入本部门五位员工的姓名和薪资,输出五位员工的姓名以及年薪。
分析:
- 需要在程序中存储五位员工的姓名和薪资,由于数据类型的不同,因此,需要定义两个数组分别存储员工姓名和薪资。
- 每个数组都存在下标,可限定两个数组中同一下标处数据描述同一个员工
//使用数组存储五位员工的姓名和薪资
String[] name = new String[5];
int[] salary = new int[5];
//使用循环对数组中的每个元素进行赋值
for (int i = 0; i < salary.length; i++) {
System.out.printf("第%d位员工信息:\n", i + 1);
System.out.print("姓名:");
name[i] = sc.next();
System.out.print("薪资:");
salary[i] = sc.nextInt();
}
//遍历所有数组元素,输出薪资以及年薪
System.out.println("姓名\t薪资\t年薪");
for (int i = 0; i < salary.length; i++) {
System.out.printf("%s\t%d\t%d\n", name[i], salary[i], 12 * salary[i]);
}
10.3.2 增强型for循环与数组的遍历
为简化对数组的遍历操作,提高数组遍历的效率,Java提供了增强型的for循环,该循环专用于数组或集合的遍历操作。
语法:
for(数据类型 变量:数组) { //循环体 }
数据与数组类型一致
循环变量为只读,在循环体中不能修改
10.3.2 foreach循环
示例:使用增强型for循环遍历一维数组
int nums[] = {1,2,3,4,5,6};
for(int num : nums) {
System.out.println(num);
}
注意:在增强型for循环的循环体中,只能依次获取数组中元素的值,不能对数组元素的值进行修改。
示例:修改示例,使用增强 for 循环实现数据的遍历。
// 遍历所有数组元素
// 输出姓名
System.out.print(" 姓名 \t");
for (String item : name) {
System.out.print(item + "\t");
}
System.out.println();
// 输出薪资
System.out.print(" 薪资 \t");
for (int item : salary) {
System.out.print(item + "\t");
}
System.out.println();
// 计算年薪并输出
System.out.print(" 年薪 \t");
for (int item : salary) {
System.out.print(12 * item + "\t");
}
10.3.3 实践练习
10.4 数组的应用(二)
10.4.1 求最大值和最小值
以求最大值为例,最大值即一组数据中最大的值。
首先,第一个上擂台的人是擂主,然后与下一个竞争对手进行比武,若取胜,则第一个人仍是擂主,否则,竞争对手便成为擂主,然后擂主继续与之后的竞争对手进行比武,以此类推,最后站在擂台上的擂主,便是本次比武的胜利者。
示例:
//定义数组,存储用户输入的成绩
int[] scores = new int[5];
//声明变量,存储最高成绩
int max;
//通过循环对数组进行赋值
System.out.println("请输入五位同学的成绩:");
for (int i = 0; i < scores.length; i++) {
scores[i] = sc.nextInt();
}
//求解最大值
//将数组第一个元素直接赋值max
max = scores[0];
//数组其余元素与max进行比较,将较大值赋值给max
for (int i = 1; i < scores.length; i++) {
if (scores[i] > max)
max = scores[i];
}
//输出比较结果
System.out.println("最高成绩:" + max);
示例:求最小值的过程与最大值类似,添加代码实现求最小值。
//求解最大值
//将数组第一个元素直接赋值max
max = scores[0];
min = scores[0];
//数组其余元素与max进行比较,将较大值赋值给max
for (int i = 1; i < scores.length; i++) {
if (scores[i] > max)
max = scores[i];
if (scores[i] < min)
min = scores[i];
}
System.out.println("最高成绩:" + max + ",最低成绩:" + min);
10.4.2 数组的排序
示例:在Java中,通过Arrays.sort()方法可以快速实现数组元素的排序(默认按升序排列)
//定义数组,存储用户输入的成绩
int[] scores = new int[5];
//通过循环对数组进行赋值
System.out.println("请输入五位同学的成绩:");
for (int i = 0; i < scores.length; i++) {
scores[i] = sc.nextInt();
}
//对数组元素进行排序
Arrays.sort(scores);
//输出排序结果
System.out.println("成绩由低到高:");
for (int item : scores) {
System.out.println(item);
}
示例:当需要实现数组中数据的降序排序时,先使用Arrays.sort()升序排序,再将数组的前半部分和后半部分交换即可。
//scores为已经升序排序的数组
//翻转数组,循环次数为数组长度的一半,如长度是6则只需要交换3次即可。
for (int i = 0; i < scores.length / 2; i++) {
//将数组元素位置颠倒,如0和最后一位,1和倒数第二位
int temp = scores[i];
// scores.length -i -1 可以获取到当前I下标需要交换的下标
//例如,0下标和最后一位的下标,1下标和数组长度减1再减去I下标
scores[i] = scores[scores.length - i - 1];
scores[scores.length - i - 1] = temp;
}
System.out.println("成绩由高到低:");
for (int item : scores) {
System.out.println(item);
}
10.4.3 实践练习
总结:
- 数组是指将具有相同类型的若干变量按照有序的形式组织起来。
- 数组中存储的数据称为数组元素,同一个数组中数组元素必须具有相同的数据类型,且在内存中连续分布。
- 数组元素按顺序进行存储和编号,数组元素的编号称为下标,数组的下标从0开始。
- 数组元素均存在下标,可以通过“数组名[下标]”的方式访问数组中的任何元素。
- 数组的使用类似于变量的使用,其步骤分为:声明数组、创建数组、初始化数组和引用数组。
- 增强型for循环主要用于遍历数组或集合,循环变量不能被重新赋值。
本文来自博客园,作者:明金同学,转载请注明原文链接:https://www.cnblogs.com/vmuu/p/15663699.html
公众号:【明金同学】