一、数组 Array

1.1 简单介绍

数组可以存放多个同一类型的数据。数组也是一种数据类型,是引用类型。
即:数组 就是一组数据。

1.2 案例演示

Array01.java

  1. /**
  2. * title: 数组案例演示
  3. */
  4. public class Array01 {
  5. public static void main(String[] args) {
  6. // 定义一个数组
  7. // 说明
  8. // 1.double[] 表示 是 double类型的数组数组名 hens
  9. // 2.{3, 5, 1, 3.4, 2, 50} 表示数组的值/元素,依次表示数组的第几个元素
  10. double[] hens = {3, 5, 1, 3.4, 2, 50, 7.8};
  11. // 遍历数组得到数组的所有元素的和,使用 for
  12. // 说明:
  13. // 1.我们可以通过 hens[下标] 来访问数组元素
  14. // 下标是从 0 开始编号的 比如第一个元素就是 hens[0]
  15. // 第二个元素 hens[1] 以此类推
  16. // 2.通过 for 循环就可以循环的访问 数组的元素/值
  17. // 3.使用一个变量 totalWeight 将各个元素累积
  18. double totalWeight = 0;
  19. // 提示:可以通过数组名.length 得到数组的长度/大小
  20. for (int i =0; i < hens.length; i++) {
  21. // System.out.println("第" + (i+1) + "个元素的值=" + hens[i]);
  22. totalWeight += hens[i];
  23. }
  24. double avgWeight = totalWeight / hens.length;
  25. System.out.println("总体重" + totalWeight + " 平均体重" + avgWeight);
  26. }
  27. }

1.3 数组的使用

数组的定义
数据类型 数组名[] = new 数据类型[ 大小 ]
int a[] = new int[5]; // 创建了一个数组,名字 a,存放5个 int
说明:这是定义数组的一种方法
数组的引用(使用)
数组名[下标/索引] 比如:你要使用 a 数组的第3个数 a[2]

  1. /**
  2. * title: 数组使用
  3. */
  4. import java.util.Scanner;
  5. public class Array02 {
  6. public static void main(String[] args) {
  7. Scanner scan = new Scanner(System.in);
  8. //演示 数据类型 数组名[] = new 数据类型[大小]
  9. //循环输入5个成绩,保存到double 数组,并输出
  10. // 步骤
  11. // 1.创建一个 double数组,大小 5
  12. double scores[] = new double[5];
  13. // 2.循环输入
  14. // scores.length 表示数组的长度
  15. for (int i = 0; i < scores.length; i++) {
  16. System.out.println("请输入第" + (i+1) + "个学生的成绩");
  17. scores[i] = scan.nextDouble();
  18. }
  19. // 3.遍历输出
  20. for (int j = 0; j < scores.length; j++) {
  21. System.out.println("第" + (j+1) + "个学生的成绩:" + scores[j]);
  22. }
  23. }
  24. }

数组的使用 - 动态初始化

  1. 先声明数组
    语法:数据类型 数组名[]; 也可以写成 数据类型[] 数组名;
    int a[]; 或者 int[] a;
  2. 创建数组
    语法:数组名 = new 数据类型[大小];
    a = new int[10];

说明:上面是声明的同时创建数组,这里是先声明数组,后创建。不创建就没法对数组赋值
应用:有时需要等到某些条件满足时,我们才创建数组。

  1. double scores[]; // 声明数组,这时 scores 是 null
  2. scores = new double[5]; // 分配内存空间,可以存放数据

数组的使用 - 静态初始化
初始化数组
语法:数据类型 数组名[] = {元素值, 元素值, ……};
int a[] = {2, 3, 8, 45, 66}
使用案例见前面 Arry01.java

1.4 数组使用注意事项和细节

  1. 数组是多个相同类型数据的组合,实现对这些数据的统一管理。
  2. 数组中的元素可以是任何数据类型,包括基本类型和引用类型,但是不能混用。
  3. 数组创建后,如果没有赋值,有默认值 int:0,short:0,byte:0,long:0,float:0.0,double:0.0,char:\u0000,boolean:false,String:null
  4. 使用数组的步骤
    1. 声明数组并开辟空间
    2. 给数组各个元素赋值
    3. 使用数组
  5. 数组的下标是从 0 开始的
  6. 数组下标必须在指定范围内使用,否则报:下标越界异常,比如:
    int[] arr = new int[5]; 则有效下标为 0-4
  7. 数组属于引用类型,数组型数据是对象(object)

1.5 数组应用案例

  1. 创建一个 char 类型的26个元素的数组,分别放置 ‘A’ - ‘Z’。使用 for 循环访问所有元素并打印出来。
    提示:char 类型数据运算 ‘A’ + 1 -> ‘B’

  2. 请求出一个数组 int[] 的最大值{4, -1, 9, 10, 23 },并得到对应的下标。

  1. public class ArrayExercise01 {
  2. public static void main(String[] args) {
  3. //创建一个 char 类型的26个元素的数组,
  4. //分别放置 'A' - 'Z'。使用 for 循环访问所有元素并打印出来
  5. // 定义数组 char类型(指定数组元素的数据类型) 数组名alphabet 长度26
  6. char alphabet[] = new char[26];
  7. // 循环输入'A' - 'Z'
  8. for (int i = 0; i < alphabet.length; i++) {
  9. // alphabet是Array[]数组类型,
  10. // alphabet[i]是数组alphabet的第i个元素,数组的元素是char类型
  11. alphabet[i] = (char)('A' + i); // char参与运算会自动转成int int->char会报错
  12. }
  13. // 循环输出
  14. for (int i = 0; i < alphabet.length; i++) {
  15. System.out.print(alphabet[i] + " ");
  16. }
  17. System.out.println();
  18. // 请求出一个数组 int[] 的最大值{4, -1, 9, 10, 23 },并得到对应的下标。
  19. int nums[] = {4, -1, 9, 10, 23 };
  20. int max = nums[0]; // 第一个元素默认是最大值
  21. int maxIndex = 0; // 最大元素的下标
  22. // 遍历数组,依次与当前最大值比较
  23. for (int i = 1; i < nums.length; i++) {
  24. if (nums[i] > max) { // 如果当前元素大于当前最大值
  25. max = nums[i]; // 更新 max 值
  26. maxIndex = i; // 更新 最大元素的下标
  27. }
  28. }
  29. System.out.println("max = " + max + "\tmaxIndex = " + maxIndex);
  30. }
  31. }

1.6 数组赋值机制

  1. 基本数据类型赋值,这个值就是具体的数据,而且相互不影响。
    int n1 = 2; int n2 = n1;
  2. 数组在默认情况下是引用传递,赋的值是地址
    看一个案例,并分析数组赋值的内存图(重点)

    1. public class ArrayAssign {
    2. public static void main(String[] args) {
    3. // 基本数据类型赋值,赋值方式是值拷贝
    4. // n2 的变化不会 影响到 n1的值
    5. int n1 = 10;
    6. int n2 = n1;
    7. n2 = 80;
    8. System.out.println("n1 = " + n1);
    9. System.out.println("n2 = " + n2);
    10. // 数组默认情况下是引用传递,赋的值是地址,赋值方式为引用赋值
    11. // 赋的是一个地址,arr2的变化 会影响到 arr1
    12. int[] arr1 = {1, 2, 3};
    13. int[] arr2 = arr1; // 把 arr1 赋给 arr2
    14. arr2[1] = 10;
    15. // 看看arr1的值
    16. System.out.println("====arr1的元素====");
    17. for (int i =0; i < arr1.length; i++) {
    18. System.out.print(arr1[i] + " ");
    19. }
    20. }
    21. }

    Java基础:数组、排序和查找 - 图1

1.7 数组拷贝

将 int[] arr1 = {1, 2, 3}; 拷贝到 arr2 数组,要求数据空间独立
ArrayCopy.java

  1. public class ArrayCopy {
  2. public static void main(String[] args) {
  3. //将 int[] arr1 = {1, 2, 3}; 拷贝到 arr2 数组,要求数据空间独立
  4. int[] arr1 = {1, 2, 3};
  5. // 创建一个新的数组arr2,开辟新的数据空间
  6. // 大小 = arr1.length
  7. int[] arr2 = new int[arr1.length];
  8. // 遍历 arr1数组,把每个元素拷贝到对应的arr2数组中
  9. for (int i = 0; i < arr1.length; i++) {
  10. arr2[i] = arr1[i];
  11. }
  12. // 遍历 arr2数组,检查是否拷贝过来
  13. for (int i = 0; i < arr2.length; i++) {
  14. System.out.print(arr2[i] + " ");
  15. }
  16. //修改 arr2数组的元素,验证是否会影响 arr1数组
  17. arr2[1] = 10;
  18. for (int i = 0; i < arr1.length; i++) {
  19. System.out.print(arr1[i] + " ");
  20. }
  21. }
  22. }

1.8 数组反转

把数组的元素内容反转。
arr {11, 22, 33, 44, 55, 66} -> {66, 55, 44, 33, 22, 11}

方法一:通过找规律反转 ArrayReverse.java

  1. public class ArrayReverse {
  2. public static void main(String[] args) {
  3. // 定义数组
  4. int arr[] = {11, 22, 33, 44, 55, 66};
  5. // 思路分析
  6. // 1. 把 arr[0] 和 arr[5] 进行交换 {66, 22, 33, 44, 55, 11}
  7. // 2. 把 arr[1] 和 arr[4] 进行交换 {66, 55, 33, 44, 22, 11}
  8. // 3. 以此类推,直至最中间的两个进行交换(如果剩1个,和自己交换)
  9. // 4. 一共要交换 (arr.length / 2) 次
  10. // 5. 每次交换时,对应的下标是 arr[i] 和 arr[arr.length - 1 - i]
  11. // 代码实现
  12. for (int i = 0; i < arr.length / 2; i++) {
  13. int temp = arr[arr.length - 1 - i]; // 保存后面元素的值
  14. arr[arr.length - 1 - i] = arr[i]; // 把前面元素的值赋值给后面元素
  15. arr[i] = temp; // 把保存的后面元素的值赋值给前面元素,完成交换
  16. }
  17. System.out.println("====翻转后的数组====");
  18. for (int i = 1; i < arr.length; i++) {
  19. System.out.print(arr[i] + " ");
  20. }
  21. }
  22. }

方法二:使用逆序赋值方式 ArrayReverse02.java

  1. public class ArrayReverse02 {
  2. public static void main(String[] args) {
  3. // 定义数组
  4. int arr[] = {11, 22, 33, 44, 55, 66};
  5. // 使用逆序赋值
  6. // 思路分析
  7. // 1.先创建一个新的数组 arr2,与原数组arr长度相同
  8. // 2.逆序遍历原数组arr ,将每个元素拷贝到arr2的元素中(顺序拷贝)
  9. // 3.建议增加一个循环变量 j -> 0 -> 5
  10. int arr2[] = new int[arr.length];
  11. for (int i = arr.length - 1,j = 0; i >= 0; i--,j++) {
  12. arr2[j] = arr[i];
  13. }
  14. // 4. 当 for 循环结束,arr2就是arr的逆序数组
  15. // 5. 让 arr 指向 arr2 的数据空间,此时 arr原来的数据空间就没有变量引用
  16. // 会被当作垃圾销毁
  17. arr = arr2;
  18. System.out.println("====翻转后的数组====");
  19. for (int i = 1; i < arr.length; i++) {
  20. System.out.print(arr[i] + " ");
  21. }
  22. }
  23. }

1.9 数组添加(扩容)

要求:实现动态的给数组添加元素的效果,实现对数组扩容

  1. 原始数组使用静态分配:int[] arr = {1, 2, 3}
  2. 增加的元素,直接放在数组的最后 arr = {1, 2, 3, 4}
    arrNew = {1, 2, 3, 4}
  3. 用户可以通过如下方法来决定是否继续添加,添加成功,是否继续? y/n
  1. import java.util.Scanner;
  2. public class ArrayAdd {
  3. public static void main(String[] args) {
  4. Scanner scan = new Scanner(System.in);
  5. int[] arr = {1, 2, 3};
  6. char said = 'y';
  7. while (said == 'y') {
  8. int arrNew[] = new int[arr.length + 1];
  9. System.out.println("请输入新增元素:");
  10. int add = scan.nextInt();
  11. for (int i = 0; i < arr.length; i++) {
  12. arrNew[i] = arr[i];
  13. }
  14. arrNew[arr.length] = add;
  15. arr = arrNew;
  16. System.out.println("==== 扩增后的数组arr ====");
  17. for (int i = 0; i < arr.length; i++) {
  18. System.out.print(arr[i] + " ");
  19. }
  20. System.out.println("添加成功,是否继续? y/n");
  21. said = scan.next().charAt(0);
  22. }
  23. }
  24. }

⏱小练习
有一个数组 {1, 2, 3, 4, 5} ,可以将该数组进行缩减(从后向前依次),提示用户是否继续缩减,每次缩减的元素值是什么。当只剩下最后一个元素,提示,不能再缩减。

二、排序

2.1 简单介绍

排序是将一群数据,依照指定的顺序进行排列的过程
排序的分类:

  1. 内部排序:
    指将需要处理的所有数据都加载到内部存储器中进行排序。
    包括:交换式排序法、选择式排序法、插入排序法
  2. 外部排序法:
    数据量过大,无法全部加载到内存中,需要借助外部存储进行排序。
    包括:合并排序法、直接合并排序法

2.2 冒泡排序法

基本思想:
通过对 待排序序列从后向前(从下标较大的元素开始),依次比较相邻元素的值,做发现逆序则交换,使值较大的元素逐渐从前移向后部,就像水底的气泡一样逐渐向上冒。

2.3 案例演示

BubbleSort.java

  1. public class BubbleSort {
  2. public static void main(String[] args) {
  3. int sums[] = {24, 69, 80, 57, 13};
  4. for (int j = 1; j < sums.length; j++) { // 定义要进行几轮比较
  5. for (int i = 0; i < sums.length - j; i++) { // 每轮冒泡具体实现
  6. if (sums[i] > sums[i + 1]) {
  7. int temp = sums[i];
  8. sums[i] = sums[i + 1];
  9. sums[i + 1] = temp;
  10. }
  11. }
  12. for (int k = 0; k < sums.length; k++) {
  13. System.out.print(sums[k] + " "); // 可以看到每轮排序后的结果
  14. }
  15. System.out.println();
  16. }
  17. }
  18. }

笔者已经学过数据结构,这里不做多注释,看不懂的可以参考这两个视频,讲解比较详细。
冒泡排序思路讲解:https://www.bilibili.com/video/BV1fh411y7R8?p=173
冒泡排序代码实现:https://www.bilibili.com/video/BV1fh411y7R8?p=174

三、查找

3.1 简单介绍

在Java中,我们常用的查找有两种:

  1. 顺序查找
    从前到后依次比较,直到查找成功为止,或者全都对不上,查找失败。
  2. 二分查找(放在算法章节讲)
    要查找的对象是有序的【前提】,每次与最中间元素的值比较,再确定向前或者向后继续进行递归的二分查找,直到查找成功为止,或者全都对不上,查找失败。

3.2 案例演示

顺序查找:SeqSearch.java

  1. import java.util.Scanner;
  2. public class SeqSearch {
  3. public static void main(String[] args) {
  4. /*
  5. 有一个数列:白眉鹰王、金毛狮王、紫衫龙王、青翼蝠王猜数游戏:
  6. 从键盘中任意输入一个名称,判断数列中是否包含此名称【顺序查找】
  7. 要求:如果找到了,就提示找到,并给出下标
  8. 思路分析
  9. 1. 定义一个字符串数组
  10. 2. 接收用户输入,遍历数组,逐一比较,如果有,则提示信息,并退出
  11. */
  12. Scanner scan = new Scanner(System.in);
  13. String names[] = {"白眉鹰王","金毛狮王","紫衫龙王","青翼蝠王"};
  14. System.out.println("请输入一个四大法王名字");
  15. String name = scan.next();
  16. int index = -1;
  17. for (int i = 0; i < names.length; i++) {
  18. if (names[i].equals(name)) {
  19. System.out.println("找到了,对应下标为" + i);
  20. //把 i 保存到 index
  21. index = i;
  22. break;
  23. }
  24. }
  25. if (index == -1) {
  26. System.out.println("没有找到" + name);
  27. }
  28. }
  29. }

四、多维数组 - 二维数组

4.1 简单介绍

  1. 从定义形式上看 int[][]。
  2. 可以这样理解,原来的一维数组的每个元素又是一个一维数组,就构成二维数组。
    每个一维数组长度可以不一样。
  3. 访问二维数组下标 i 的元素的第下标 j 的值 :int[ i ][ j ]

4.2 案例演示

TwoDimensionalArray.java

  1. /**
  2. * title: 二维数组案例演示 TwoDimensionalArray.java
  3. */
  4. public class TwoDimensionalArray {
  5. public static void main(String[] args) {
  6. /*
  7. 请用二维数组输出如下图形
  8. 0 0 0 0 0 0
  9. 0 0 1 0 0 0
  10. 0 2 0 3 0 0
  11. 0 0 0 0 0 0
  12. */
  13. int[][] arr = { {0, 0, 0, 0, 0, 0},
  14. {0, 0, 1, 0, 0, 0},
  15. {0, 2, 0, 3, 0, 0},
  16. {0, 0, 0, 0, 0, 0} };
  17. // 输出二维图形
  18. for (int i = 0; i < arr.length; i++) { // 遍历二维数组的每个元素
  19. // 遍历二维数组的每个元素
  20. // 1. arr[i] 表示二维数组的第i个元素,因为元素值也是数组(一维)
  21. // 所以arr[i].length 就是该元素(一维数组)的长度
  22. for (int j = 0; j < arr[i].length; j++) {
  23. System.out.print(arr[i][j] + " "); // 输出一维数组
  24. }
  25. System.out.println(); // 换行
  26. }
  27. }
  28. }

4.3 二维数组的使用

使用方式1:动态初始化

  1. 语法:数据类型[][] 数组名=new 类型[大小][大小]
  2. 比如:int a[][] = new int[2][3] 定义一个二维数组a,含有两个长度为3的一维数组
  3. 二维数组在内存的存在形式

Java基础:数组、排序和查找 - 图2

使用方式2:动态初始化

  1. 先声明:数据类型[][];
  2. 再定义(开辟空间) 数组名 = new 数据类型[大小][大小]
  3. 赋值(有默认值,同一维数组)
    1. int arr[][]; // 声明二维数组
    2. arr = new int[2][3]; // 定义

使用方式3:动态初始化 - 列数不确定
看一个需求:动态创建下面的二维数组,并输出
Java基础:数组、排序和查找 - 图3
案例演示 TwoDimensionalArray03.java

  1. /**
  2. * title: 二维数组动态初始化 - 列数不确定 案例演示
  3. */
  4. public class TwoDimensionalArray03 {
  5. public static void main(String[] args) {
  6. // 一共有三个一维数组,每个长度不一样
  7. int[][] arr = new int[3][]; // 创建二维数组,只确定有多少个元素
  8. for (int i = 0; i < arr.length; i++) { // 遍历arr每一个一维数组
  9. // 给每个一维数组开空间 new
  10. // 如果没有给一维数组,那么 arr[i] 就是null
  11. arr[i] = new int[i + 1];
  12. // 遍历一维数组,并给一维数组的每个元素赋值
  13. for (int j = 0; j < arr[i].length; j++) {
  14. arr[i][j] = i + 1;
  15. }
  16. }
  17. for (int i = 0; i < arr.length; i++) {
  18. for (int j = 0; j < arr[i].length; j++) {
  19. System.out.print(arr[i][j] + " ");
  20. }
  21. System.out.println();
  22. }
  23. }
  24. }

使用方式4:静态初始化

  1. 定义:数据类型 数组名[][] = { { 值1, 值2…… }, { 值1, 值2…… }.{ 值1, 值2…… }…… };
  2. 案例演示 见前面 TwoDimensionalArray.java

4.4 二维数组的遍历

TwoDimensionalArray04.java

  1. /**
  2. * title: 二维数组的遍历
  3. */
  4. public class TwoDimensionalArray04 {
  5. public static void main(String[] args) {
  6. // 需求:遍历二维数组,并求和
  7. int arr[][] = {{4, 6}, {1, 4, 5, 7}, {-2}};
  8. int sum = 0;
  9. for (int i = 0; i < arr.length; i++) {
  10. for (int j = 0; j < arr[i].length; j++) {
  11. sum += arr[i][j];
  12. }
  13. }
  14. System.out.println("二维数组的和是" + sum);
  15. }
  16. }

4.5 二维数组的应用案例

  1. 使用二维数组打印一个 10 行 杨辉三角
    1
    1 1
    1 2 1
    1 3 3 1
    1 4 6 4 1
    1 5 10 10 5 1
    ……
    YangHui.java

    1. /**
    2. * title: 杨辉三角二维数组
    3. */
    4. public class YangHui {
    5. public static void main(String[] args) {
    6. /*
    7. 1
    8. 1 1
    9. 1 2 1
    10. 1 3 3 1
    11. 1 4 6 4 1
    12. 1 5 10 10 5 1
    13. 一共 10 行
    14. 规律:
    15. 1. 第一行有 1 个元素,第 n 行有 n 个元素
    16. 2. 每一行的第一个元素和最后一个元素都是1
    17. 3. 从第 3 行开始,对于非第一个元素和最后一个元素的值 yang[i][j]
    18. yang[i][j] = yang[i - 1][j - 1] + yang[i - 1][j]; // 必须找到这个规律
    19. */
    20. int[][] yang = new int[10][];
    21. for (int i = 0; i < yang.length; i++) { // 遍历二维数组每个元素
    22. // 给每个一维数组开辟空间
    23. yang[i] = new int[i + 1];
    24. for (int j = 0; j < yang[i].length; j++) {
    25. // 每一行的第一个元素和最后一个元素都是 1
    26. if (j == 0 || j == yang[i].length - 1) {
    27. yang[i][j] = 1;
    28. } else { // 中间元素
    29. yang[i][j] = yang[i - 1][j - 1] + yang[i - 1][j];
    30. }
    31. }
    32. }
    33. // 输出杨辉三角
    34. for (int i = 0; i < yang.length; i++) {
    35. for (int j = 0; j < yang[i].length; j++) {
    36. System.out.print(yang[i][j] + " ");
    37. }
    38. System.out.println();
    39. }
    40. }
    41. }

4.6 二维数组使用细节和注意事项

  1. 一维数组的声明方式有:
    int[] x 或者 int x[]
  2. 二维数组的声明方式有:
    int[][] y 或者 int[] y[] 或者 int y[][]
  3. 二维数组实际上是由多个一维数组组成的,它的各个一维数组的长度可以相同,也可以不同。
    比如:map[][] 是一个二维数组
    int map[][] = {{1, 2}, {3, 4, 5}};
    由 map[0] 是一个含有两个元素的一维数组,map[1]是一个含有三个元素的一维数组构成,我们也成为列数不等的二维数组。

⏱ 小练习
声明:int[] x,y[];以下选项允许通过编译的是(b e )

  1. x[0] = y;
  2. y[0] = x;
  3. y[0][0] = x;
  4. x[0][0] = y;
  5. y[0][0] = x[0];
  6. x = y;

五、本章作业

  1. 下面数组定义正确的有bd__

    1. String strs[] = { ‘a’, ‘b’, ‘c’ };
    2. String[] strs = { “a”, “b”, “c” };
    3. String[] strs = new String{ “a”, “b”, “c” };
    4. String strs[] = new String[]{ “a”, “b”, “c” };
    5. String[] strs = new String[3]{ “a”, “b”, “c” };
  2. 写出结果
    String foo = “blue”;
    boolean[] bar = new boolean[2];
    if ( bar[0] ) {
    foo = “green”;
    }
    System.out.println( foo );

  3. 以下Java代码的输出结果为
    int num=1;

while ( num < 10 ) {
System.out.println( num );
if(num>5){
break;
}
num+=2;
}

  1. 已知有个升序的数组,要求插入一个元素,该数组顺序依然是升序,
    比如:[10,12,45,90],添加23后,数组为[10,12,23,45,90]

    1. public class Homework04 {
    2. public static void main(String[] args) {
    3. int[] arr = {10, 12, 45, 90};
    4. int insert = 23; // 插入的新值(可以改成用户键盘输入方式)
    5. int i = 0; // 用于确定新值的插入位置
    6. while (arr[i] < insert) { // 循环遍历数组,找到插入位置
    7. i++;
    8. if (i == arr.length) {
    9. break; // 如果新值比数组所有值都大,立即退出while循环,否则会发生越界报错
    10. }
    11. }
    12. int[] arrNew = new int[arr.length + 1]; // 扩充数组
    13. arrNew[i] = insert; // 新值先插入到之前确定的位置
    14. for (int j = 0; j < arrNew.length - 1; j++) { // 把arr的值依次插入到扩充数组
    15. if (j < i) {
    16. arrNew[j] = arr[j];
    17. } else {
    18. arrNew[j + 1] = arr[j];
    19. }
    20. }
    21. arr = arrNew; // arr 指向扩充数组
    22. for (int k = 0; k < arr.length; k++) {
    23. System.out.println(arr[k] + " ");
    24. }
    25. }
    26. }
  2. 随机生成10个整数(1-100的范围)保存到数组,并倒序打印以及求平均值、求最大值和最小值及其下标、并查找里面是否有8,用冒泡排序法从小到大排序 ```java

public class Homework05 {

  1. public static void main(String[] args) {
  2. // 定义一个保存10个随机数的数组
  3. int[] arr = new int[10];
  4. int sum = 0;
  5. // 生成10个随机数并依次保存到数组
  6. for (int i = 0; i < arr.length; i++) {
  7. arr[i] = (int)(Math.random() * 100 + 1);
  8. System.out.print(arr[i] + " ");
  9. }
  10. System.out.println(); // 换行
  11. // 倒序输出
  12. for (int i = arr.length - 1; i >=0; i--) {
  13. System.out.print(arr[i] + " ");
  14. sum += arr[i]; // 累积求和
  15. }
  16. // 求平均值
  17. System.out.println("平均值为" + (double)sum / arr.length);
  18. // 求最大值及下标
  19. int max = arr[0];
  20. int index1 = 0;
  21. for (int i = 1; i < arr.length; i++) {
  22. if (arr[i] > max) {
  23. max = arr[i];
  24. index1 = i;
  25. }
  26. }
  27. System.out.println("最大值为" + max + "下标为" + index1);
  28. // 求最小值及下标
  29. int min = arr[0];
  30. int index2 = 0;
  31. for (int i = 1; i < arr.length; i++) {
  32. if (arr[i] < min) {
  33. min = arr[i];
  34. index2 = i;
  35. }
  36. }
  37. System.out.println("最小值为" + min + "下标为" + index2);
  38. // 查找里面是否有8
  39. int index3 = -1;
  40. for (int i = 0; i < arr.length; i++) {
  41. if (arr[i] == 8) {
  42. System.out.println("数组里面有8,下标为" + i);
  43. index3++;
  44. }
  45. }
  46. if (index3 == -1) {
  47. System.out.println("数组里面没有8");
  48. }
  49. // 冒泡排序
  50. int change = 0;
  51. int isChange = -1;
  52. for (int i = 0; i < arr.length - 1; i++) {
  53. isChange = change; // 上次冒泡排序后 记录调换动作 的值
  54. for (int j = 0; j < arr.length - 1 - i; j++) {
  55. if (arr[j] > arr[j + 1]) {
  56. int temp = arr[j + 1];
  57. arr[j + 1] = arr[j];
  58. arr[j] = temp;
  59. change++; // 记录调换动作
  60. }
  61. }
  62. if (isChange == change) { // 上次和本次对比
  63. break; // 如果本次没有进行排序调换动作,直接提前退出
  64. }
  65. for (int k = 0; k < arr.length; k++) {
  66. System.out.print(arr[k] + " ");
  67. }
  68. System.out.println();
  69. }
  70. }

} ```

  1. 试写出以下代码的打印结果
    char[] arr1 = {‘a’,’z’,’b’,’c’);

char[] arr2 = arr1;
arr1[2] = ‘韩’;
for(int i = 0;i < arr2.length;i++){
System.out.println(arr1[i] + “,” + arr2[i] );
}

学习参考(致谢):

  1. B站 @程序员鱼皮 Java学习一条龙
  2. B站 @韩顺平 零基础30天学会Java