一、知识点
1.数组的概述
- 数组,就可以理解为多个数据的组合。
- 是程序中的容器:数组、集合框架(第12章,List、Set、Map)。
- 数组存储的数据的特点:依次紧密排列的、有序的、可以重复的。
- 此时的数组、集合框架都是在内存中对多个数据的存储。
- 数组的其它特点:一旦初始化,其长度就是确定的、不可更改的。
基本语法的知识点:
1. 数组的理解(Array)
概念:是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理。
简称:地多个数据的组合
Java中的容器:数组、集合框架(第12章)。在内存中对多个数据的存储。
2.几个相关的概念
> 数据名
> 数组的元素(既内部存储的多个元素)
> 数组的下标、角标、小角标、索引、index(即找到指定数组元素所使用的编号)
> 数组的长度(既数组容器中存储的元素的个数)
3.数组的特点:
> 数组中的元素在内存中是依次紧密排列的,有序的。
> 数组,属于引用数据类型的变量。数组的元素,既可以是基本数据类型,也可以是引用数据类型。
> 数组,一旦初始化完成,共长度就确定了,并且长度不可更改。
> 创建数组对象会扎起内存中开辟一整块‘连续的空间’。占据的空间的大小,取决于数组的长度和数组中元素的类型。
4. 复习:变量按章数据类型的分类
4.1 基本数据类型: byte \ short \ int \ long \ char \ boolean \ float \ double
4.2 引用数据类型: 类、数组、接口、枚举、注解、记录
5. 数组的分类
5.1 按照元素的类型:基本数类型元素的数组,引用数据类型元素的数组
5.2 按照元素的维数来分:一维数组,二维数组,...
6. 一维数组的使用(6个基本点)
> 数组的声明和初始化
> 调用数组的指定元素
> 数组的属性:length,表示数组的长度
> 数组的遍历
> 数组元素的默认初始化值
> 一维数组的内存解析(难)
7. 数组元素的默认初始化值的情况
注意:以数组的动态初始化方式为例说明。
> 整型数组元素的默认初始化值:0
> 浮点型数组元素的默认初始化值:0.0
> 字符型数组元素的默认初始化值:0 (或理解为'\u0000')
> boolean型数组元素的默认初始化值:false
> 引用数据类型数组元素的默认初始化值:null
8. 一维数组的内存解析
8.1 Java中的内存结构是如何划分的?(主要关心JVM的运行时内存环境)
> 将内存区域划分为5个部分:程序计数器、虚拟机栈、本地方法栈、堆、方法区
> 与目前数组相关的内存结构: 比如:int[] arr = new int[]{1,2,3};
> 虚拟机栈:用于存放方法中声明的变量。比如:arr
> 堆:用于存放数组的实体(即数组中的所有元素)。比如:1,2,3
8.2 举例:具体一维数组的代码的内存解析
基本语法的代码1:
package com.atguigu1.one;
/**
* ClassName: OneArraryTest
* Package: com.atguigu1.one
* Description: 一维数组的基本使用
*
* @Author 随心油条
* @Create 2024/1/25 9:52
* @Version 1.0
*/
public class OneArraryTest {
public static void main(String[] args) {
// 1. 数组的声明与初始化
// 复习:变量的定义格式:数据类型 变量名 = 变量值
int num1 = 10;
int num2; //声明
num2 = 20; //初始化
// 1.1 声明数组
double[] prices;
// 1.2 数组的初始化
// 静态初始化:数组变量的赋值与数组元素的赋值操作同时进行。
prices = new double[]{20.32,43.21,43.22};
// 这里不能使用
// princes = {20.32,43.21,43.22};
// String[] foods;
// foods = new String[]{"拌海蜇","龙须菜","炝冬笋","玉兰片"};
// 数组的声明和初始化
// 动态初始化:数组变量的赋值与数组元素的赋值操作分开进行。
String[] foods = new String[4];
// 其他正确的方式
int arr[] = new int[4];
int[] arr1 = new int[]{1,2,3,4};
// 错误的方式
// int[] arr2 = new int[4]{1,2,3,4};//既有动态,又有静态 报错的原因为:同时使用维表达式和初始化创建数组是非法的
// int[3] arr3 = new int[]; //声明数组元素个数只能从后面的[]中声明
// 2.数组元素的调用
// 通过角标的方式,获取数组的元素
// 角标的范围从0开始,到数组的长度-1结束
System.out.println(prices[0]);
System.out.println(prices[2]);
// System.out.println(prices[4]);//异常:ArrayIndexOutOfBoundsException
foods[0] = "拌海蜇";
foods[1] = "龙须菜";
foods[2] = "炝冬笋";
foods[3] = "玉兰片";
// foods[4] = "酱茄子";//异常:ArrayIndexOutOfBoundsException
// 3.数组的长度:用来描述数组容器中容量的大小
// 使用length属性表示
System.out.println(foods.length);//4
System.out.println(prices.length);//3
// 4.如何遍历数组
// System.out.println(foods[0]);
// System.out.println(foods[1]);
// System.out.println(foods[2]);
// System.out.println(foods[3]);
for (int i = 0; i < foods.length; i++){
System.out.println(foods[i]);
}
}
}
基本语法的代码2:
package com.atguigu1.one;
/**
* ClassName: OneArraryTest1
* Package: com.atguigu1.one
* Description: 一维数组的基本使用(承接OneArrayTest.java)
*
* @Author 随心油条
* @Create 2024/1/25 10:47
* @Version 1.0
*/
public class OneArraryTest1 {
public static void main(String[] args) {
//5. 数组元素的默认初始化值
// 整形数组元素的默认初始化值:0
int[] arr1 = new int[3];
System.out.println(arr1[0]);//输出为0
// 整形数组元素的默认初始化值:0
short[] arry2 = new short[2];
for (int i = 0; i < arry2.length; i++) {
System.out.println(arry2[i]); //输出0
}
// 浮点型数组元素的默认初始化值:0.0
double[] arry3 = new double[4];
System.out.println(arry3[1]); //输出0.0
// 字符型数组元素的默认初始化值:0 (或理解为'\u0000')
char[] arry4 = new char[2];
System.out.println(arry4[1]);
if (arry4[1] == 0){
System.out.println("aaaa"); //输出aaaa
}
if (arry4[1] == '0'){
System.out.println("bbbb");
}
if (arry4[1] == '\u0000'){
System.out.println("cccc"); //输出cccc
}
System.out.println((arry4[0] + 1)); //输出1
// boolean型数组元素的默认初始化值:
boolean[] arry5 = new boolean[2];
System.out.println(arry5[0]); //输出false
// 引用数据类型数组元素的默认初始化值:null 而不是 "null"
String[] arry6 = new String[5];
System.out.println(arry6[0]); // 输出null
if (arry6[1] == null){
System.out.println("1111"); //输出1111
}
if (arry6[1] == "null"){
System.out.println("2222");
}
//6.数组的内存解析
int[] a1 = new int[]{1,2,3};
// int a2 = a1; //会报错:不兼容的类型: int[]无法转换为int
int[] a2 = a1; //没有new就没有新开辟空间,就用的a1的地址
a2[1] = 10;
System.out.println(a1[1]); //输出10
System.out.println(a1); //输出数组a1的地址[I@776ec8df 其中[表示数组,@表示地址,776ec8df表示地址的数值,且为十六进制
System.out.println(a2); //输出数组a2的地址[I@776ec8df
}
}
案例1:
package com.atguigu1.one.exer1;
/**
* 案例:"破解"房东电话
*
* 升景坊单间短期出租4个月,550元/月(水电煤公摊,网费35元/月),空调、卫生间、厨房齐全。屋内均是IT行业人士,喜欢安静。
* 所以要求来租者最好是同行或者刚毕业的年轻人,爱干净、安静。
*
*/
/**
* ClassName: ArrayExer
* Package: com.atguigu1.one.exer1
* Description: 案例
*
* @Author 随心油条
* @Create 2024/1/25 14:07
* @Version 1.0
*/
public class ArrayExer {
public static void main(String[] args) {
int[] arr = new int[]{ 8, 6, 1, 0, 3};
int[] index = new int[]{ 2, 4, 3, 1, 0, 4, 1, 2, 1, 4, 2};
String tel = "";
for (int i = 0; i < index.length; i++) {
int value = index[i];
tel += arr[value];
}
System.out.println("联系方式: " + tel);//输出:18013820100
}
}
案例2:
需求:
案例:输出英文星期几
用一个数组,保持星期一到星期天的7个英语但粗,从键盘输入1-7,显示对应的单词
{"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"}
拓展:一年12个月的存储
用一个数组,保存12个月的英语单词,从键盘输入1-12,显示对应的单词。
{"January","February","March","April","May","June","July","August","September","October","November","December"}
代码:
package com.atguigu1.one.exer2;
import java.util.Scanner;
/**
* ClassName: ArrayExer
* Package: com.atguigu1.one.exer2
* Description: 案例:输出英文星期几
*
* 用一个数组,保存星期一到星期天的7个英语单词,从键盘输入1-7,显示对应的单词
* {"Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"}
*
* @Author 随心油条
* @Create 2024/1/25 14:15
* @Version 1.0
*/
public class ArrayExer02 {
public static void main(String[] args) {
// 定义包含7个单词的数组
String[] weeks = new String[]{ "Monday","Tuesday","Wednesday","Thursday","Friday","Saturday","Sunday"};
// 从键盘获取指定的数值,使用Scanner
Scanner input = new Scanner(System.in);
System.out.print("请输入1-7的整数: ");
int chooes = input.nextInt();
// 没有定义数组的时候就这么做,现在定义数组了就换种方式.
// switch (chooes) {
// case 1:
// System.out.println("您的结果为: " + weeks[0]);
// break;
// case 2:
// System.out.println("您的结果为: " + weeks[1]);
// break;
// case 3:
// System.out.println("您的结果为: " + weeks[2]);
// break;
// case 4:
// System.out.println("您的结果为: " + weeks[3]);
// break;
// case 5:
// System.out.println("您的结果为: " + weeks[4]);
// break;
// case 6:
// System.out.println("您的结果为: " + weeks[5]);
// break;
// case 7:
// System.out.println("您的结果为: " + weeks[6]);
// break;
// }
// 针对获取的数据进行判断即可
if (chooes < 1 || chooes > 7){
System.out.println("您的输入有误!!");
}else {
System.out.println("您的结果为:" + weeks[chooes - 1]);
}
input.close();
}
}
案例3:
需求:
案例:学生考试等级划分
从键盘读入学生成绩,找出最高分,并输出学生成绩等级。
成绩>=最高分-10 等级为’A’
成绩>=最高分-20 等级为’B’
成绩>=最高分-30 等级为’C’
其余 等级为’D’
提示:先读入学生人数,根据人数创建int数组,存放学生成绩。
代码1:
package com.atguigu1.one.exer3;
import java.util.Scanner;
/**
* ClassName: ArrayExer03
* Package: com.atguigu1.one.exer3
* Description: 从键盘读入学生成绩,找出最高分,并输出学生成绩等级。
*
* * 成绩>=最高分-10 等级为’A’
* * 成绩>=最高分-20 等级为’B’
* * 成绩>=最高分-30 等级为’C’
* * 其余 等级为’D’
*
* @Author 随心油条
* @Create 2024/1/25 14:35
* @Version 1.0
*/
public class ArrayExer03 {
public static void main(String[] args) {
//1.从键盘数入学生的人数,根据人数,创建数组(动态初始化)
Scanner input = new Scanner(System.in);
System.out.print("请输入学生的人数: ");
int studentNum = input.nextInt();
int[] num = new int[studentNum];
//2.根据提示,依次输入学生成绩,并将成绩保存在数组元素中
System.out.println("请依次输入学生成绩: ");
int[] scores = new int[studentNum];
for (int i = 0; i < studentNum; i++) {
int score = input.nextInt();
scores[i] =score;
}
//3.获取学生成绩的最大值
int maxScore = scores[0];
for (int i = 1; i < scores.length; i++){
if (maxScore < scores[i]){
maxScore = scores[i];
}
}
System.out.println("学生成绩最大值为: " + maxScore);
//4.遍历数组元素,根据学生成绩与最高分的差值,得到每个学生的等级,并输出成绩和等级
for (int i = 0; i < scores.length; i++){
if (maxScore - scores[i] <= 10){
System.out.println("student[" +i +"]的成绩为: " + scores[i] + '\t' + "等级为A");
} else if (maxScore - scores[i] <= 20) {
System.out.println("student[" +i +"]的成绩为: " + scores[i] + '\t' + "等级为B");
}else if (maxScore - scores[i] <= 30) {
System.out.println("student[" +i +"]的成绩为: " + scores[i] + '\t' + "等级为C");
}else {
System.out.println("student[" +i +"]的成绩为: " + scores[i] + '\t' + "等级为D");
}
}
//关闭资源
input.close();
}
}
代码2:
package com.atguigu1.one.exer3;
import java.util.Scanner;
/**
* ClassName: ArrayExer03_1
* Package: com.atguigu1.one.exer3
* Description: 基于ArrayExer03的改进
*
* @Author 随心油条
* @Create 2024/1/25 15:26
* @Version 1.0
*/
public class ArrayExer03_1 {
public static void main(String[] args) {
//1.从键盘数入学生的人数,根据人数,创建数组(动态初始化)
Scanner input = new Scanner(System.in);
System.out.print("请输入学