前言
在深入数组的学习之前,让我们回顾一下之前学过的关键概念:
-
Scanner类:用于从键盘接收输入。
- 导入:
import java.util.Scanner
- 创建对象:
Scanner 名字 = new Scanner(System.in)
- 方法:
nextInt()
:读取整数next()
:读取字符串,空格和回车结束nextLine()
:读取字符串,回车结束
- 导入:
-
switch语句:多分支选择结构。
- 格式:
switch(变量){ case 常量值1: 执行语句1; break; case 常量值2: 执行语句2; break; ... default: 执行语句n; break; }
- 执行流程:变量值匹配
case
后的常量值,匹配成功执行对应语句,否则执行default
。
- 格式:
-
if…else语句:条件判断结构。
- 格式:
if(boolean表达式){ 执行语句1 }else{ 执行语句2 }
- 格式:
-
else…if语句:多条件判断结构。
- 格式:
if(boolean表达式){ 执行语句1 }else if(boolean表达式){ 执行语句2 }...else{ 执行语句n }
- 格式:
-
for循环:已知循环次数的循环结构。
- 格式:
for(初始化变量;比较;步进表达式){ 循环语句 }
- 格式:
-
while循环:先判断后执行的循环结构。
- 格式:
初始化变量; while(比较){ 循环语句 步进表达式 }
- 格式:
-
do…while循环:至少执行一次的循环结构。
- 格式:
初始化变量; do{ 循环语句 步进表达式 }while(比较);
- 格式:
-
死循环:无限循环,条件永远为
true
。 -
嵌套循环:循环中包含另一个循环。
-
循环控制关键字:
break
:结束循环。continue
:结束本次循环,进入下一次循环。
-
Random类:生成随机数的类。
- 导入:
import java.util.Random
- 创建对象:
Random 对象名 = new Random()
- 方法:
nextInt()
:生成一个随机整数。nextInt(int bound)
:生成一个0到bound-1
之间的随机整数。
- 导入:
模块五重点
本模块我们将重点学习数组的相关知识:
- 数组的定义和特点。
- 数组的操作(存储数据、获取数据、遍历数据)。
- 二维数组的定义、操作和遍历。
第一章:数组的定义
数组是一种容器,可以存储多个数据,属于引用数据类型。
定义数组
动态初始化
数据类型[] 数组名 = new 数据类型[长度];
数据类型 数组名[] = new 数据类型[长度];
静态初始化
数据类型[] 数组名 = new 数据类型[]{元素1,元素2...};
数据类型 数组名[] = new 数据类型[]{元素1,元素2...};
简化静态初始化
数据类型[] 数组名 = {元素1,元素2...};
示例代码
public class Demo01Array {
public static void main(String[] args) {
// 动态初始化
int[] arr1 = new int[3];
String[] arr2 = new String[3];
// 静态初始化
int[] arr3 = new int[]{1,2,3,4,5};
// 简化静态初始化
int[] arr4 = {1,2,3,4,5};
String[] arr5 = {"乾隆","和珅","纪晓岚"};
}
}
第二章:数组操作
获取数组的长度
数组名.length
示例代码
public class Demo01Array {
public static void main(String[] args) {
String[] arr1 = {"迪迦奥特曼","猫和老鼠","花园宝宝","海绵宝宝","圣斗士","百变小樱魔术卡","熊出没"};
int len = arr1.length;
System.out.println("len = " + len);
}
}
索引
索引是元素在数组中的位置,从0开始,最大索引是数组长度-1。
存储元素
数组名[索引值] = 值;
示例代码
public class Demo02Array {
public static void main(String[] args) {
int[] arr = new int[3];
arr[0] = 100;
arr[1] = 200;
arr[2] = 300;
System.out.println("============================");
String[] arr1 = new String[3];
arr1[0] = "东方不败";
arr1[1] = "岳不群";
arr1[2] = "林平之";
}
}
获取元素
数组的默认值:
- 整数:0
- 小数:0.0
- 字符:‘\u0000’
- 布尔:false
- 引用:null
示例代码
public class Demo05Array {
public static void main(String[] args) {
int[] arr = new int[3];
arr[0] = 100;
arr[1] = 200;
arr[2] = 300;
System.out.println(arr); // 地址值
System.out.println(arr[0]); // 输出0索引上的元素
System.out.println(arr[1]); // 输出1索引上的元素
System.out.println(arr[2]); // 输出2索引上的元素
}
}
遍历数组
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
示例代码
public class Demo07Array {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6};
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
第三章:操作数组时两个常见的问题
数组索引越界异常 ArrayIndexOutOfBoundsException
public class Demo09Array {
public static void main(String[] args) {
int[] arr = new int[3];
arr[0] = 100;
arr[1] = 200;
arr[2] = 300;
//arr[3] = 400;//索引3超出了arr的索引范围
//arr[-1] = 1000;//索引3超出了arr的索引范围
for (int i = 0; i <= arr.length; i++) {
System.out.println(arr[i]);//索引3超出了arr的索引范围
}
}
}
当操作的索引超出数组索引范围时抛出。
空指针异常 NullPointerException
public class Demo09Array {
public static void main(String[] args) {
int[] arr = new int[3];
arr[0] = 100;
arr[1] = 200;
arr[2] = 300;
//arr[3] = 400;//索引3超出了arr的索引范围
//arr[-1] = 1000;//索引3超出了arr的索引范围
for (int i = 0; i <= arr.length; i++) {
System.out.println(arr[i]);//索引3超出了arr的索引范围
}
}
}
当一个对象为null
时,再调用此对象中的其他成员时抛出。
第四章:数组练习
练习1:求数组中的最大值
public class Demo01GetMax {
public static void main(String[] args) {
int[] arr = {5,3,5,7,4,6,8,9};
int max = arr[0];
for (int i = 1; i < arr.length; i++) {
if (max < arr[i]) {
max = arr[i];
}
}
System.out.println("max = " + max);
}
}
练习2:统计特定条件的个数
随机产生10个[0,100]之间的整数,统计既是3的倍数又是5的倍数但不是7的倍数的个数。
public class Demo02Count {
public static void main(String[] args) {
Random rd = new Random();
int[] arr = new int[10];
int count = 0;
for (int i = 0; i < arr.length; i++) {
arr[i] = rd.nextInt(101);
}
for (int i = 0; i < arr.length; i++) {
if (arr[i] % 3 == 0 && arr[i] % 5 == 0 && arr[i] % 7 != 0) {
count++;
}
}
System.out.println("count = " + count);
}
}
练习3:键盘录入姓名并遍历显示
public class Demo03Print {
public static void main(String[] args) {
String[] arr = new String[3];
Scanner sc = new Scanner(System.in);
for (int i = 0; i < arr.length; i++) {
System.out.println("请您输入第"+(i+1)+"个学员姓名:");
arr[i] = sc.next();
}
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i]);
}
}
}
练习4:输出数组元素
定义一个数组int[] arr = {1,2,3,4}
,遍历数组,输出元素按照[1,2,3,4]
格式。
public class Demo04PrintRegex {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4};
System.out.print("[");
for (int i = 0; i < arr.length; i++) {
if (i == arr.length - 1) {
System.out.print(arr[i] + "]");
} else {
System.out.print(arr[i] + ",");
}
}
}
}
练习5:统计偶数个数
随机50个1-100之间的整数,统计偶数个数。
public class Demo05Count {
public static void main(String[] args) {
int[] arr = new int[50];
Random rd = new Random();
for (int i = 0; i < arr.length; i++) {
arr[i] = rd.nextInt(100) + 1;
}
int count = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i] % 2 == 0) {
count++;
}
}
System.out.println("count = " + count);
}
}
练习6:查找整数的索引位置
键盘录入一个整数,找出整数在数组中存储的索引位置。
public class Demo06Search {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int[] arr = {11,22,33,44,55,66,22};
int data = sc.nextInt();
int flag = 0;
for (int i = 0; i < arr.length; i++) {
if (data == arr[i]) {
System.out.println(i);
flag++;
}
}
if (flag == 0) {
System.out.println(-1);
}
}
}
练习7:数组复制
将一个数组的内容复制到另一个数组中。
public class Demo07ArrayCopy {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6};
int[] newArr = new int[arr.length];
for (int i = 0; i < arr.length; i++) {
newArr[i] = arr[i];
}
for (int i = 0; i < newArr.length; i++) {
System.out.println(newArr[i]);
}
}
}
练习8:数组扩容
将一个数组的长度从5扩容到10。
public class Demo08ArrayExpand {
public static void main(String[] args) {
int[] arr1 = {1, 2, 3, 4, 5};
int[] newArr = new int[10];
for (int i = 0; i < arr1.length; i++) {
newArr[i] = arr1[i];
}
arr1 = newArr;
System.out.println(arr1.length);
for (int i = 0; i < arr1.length; i++) {
System.out.println(arr1[i]);
}
}
}
练习9:数组合并
合并两个数组。
public class Demo09ArrayMerge {
public static void main(String[] args) {
int[] arr1 = {1, 2, 3};
int[] arr2 = {4, 5, 6};
int[] newArr = new int[arr1.length + arr2.length];
for (int i = 0; i < arr1.length; i++) {
newArr[i] = arr1[i];
}
int len = arr1.length;
for (int i = 0; i < arr2.length; i++) {
newArr[len + i] = arr2[i];
}
for (int i = 0; i < newArr.length; i++) {
System.out.print(newArr[i] + " ");
}
}
}
第五章:内存图
在Java中,内存被分为五大块,其中栈、堆和方法区是重点。
- 栈(Stack):方法运行的地方,方法运行完毕后需要弹栈。
- 堆(Heap):每次使用
new
关键字都会在堆内存中开辟空间。 - 方法区(Method Area):记录类的信息和方法的信息。
- 本地方法栈(Native Method Stack):运行本地方法。
- 寄存器(Registers):与CPU相关。
第六章:二维数组
定义格式
动态初始化
数据类型[][] 数组名 = new 数据类型[m][n];
静态初始化
数据类型[][] 数组名 = new 数据类型[][]{{元素1,元素2...},{元素1,元素2...},{元素1,元素2...}};
简化静态初始化
数据类型[][] 数组名 = {{元素1,元素2...},{元素1,元素2...},{元素1,元素2...}};
示例代码
public class Demo01Array {
public static void main(String[] args) {
int[][] arr1 = new int[2][2];
int[][] arr2 = new int[2][];
System.out.println("======================");
String[][] arr3 = {{"孙悟空","唐僧"},{"刘备","关羽","张飞"},{"宋江"},{"林黛玉","贾宝玉","王熙凤","薛宝钗"}};
}
}
获取二维数组长度
数组名.length
示例代码
public class Demo02Array {
public static void main(String[] args) {
String[][] arr = {{"张三","李四"},{"王五","赵六","田七"},{"猪八","牛九"}};
System.out.println(arr.length);
for (int i = 0; i < arr.length; i++) {
System.out.println(arr[i].length);
}
}
}
获取二维数组中的元素
数组名[i][j]
示例代码
public class Demo03Array {
public static void main(String[] args) {
String[][] arr = {{"张三","李四"},{"王五","赵六","田七"},{"猪八","牛九"}};
System.out.println(arr[0][0]);
System.out.println(arr[2][0]);
System.out.println(arr[1][1]);
}
}
二维数组中存储元素
数组名[i][j] = 值
示例代码
public class Demo04Array {
public static void main(String[] args) {
String[][] arr = new String[2][2];
arr[0][0] = "张飞";
arr[0][1] = "李逵";
arr[1][0] = "刘备";
arr[1][1] = "宋江";
System.out.println(arr[0][0]);
System.out.println(arr[0][1]);
System.out.println(arr[1][0]);
System.out.println(arr[1][1]);
}
}
二维数组的遍历
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.println(arr[i][j]);
}
}
示例代码
public class Demo05Array {
public static void main(String[] args) {
String[][] arr = new String[2][2];
arr[0][0] = "张飞";
arr[0][1] = "李逵";
arr[1][0] = "刘备";
arr[1][1] = "宋江";
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr[i].length; j++) {
System.out.println(arr[i][j]);
}
}
}
}