# 华东师范大学数据科学与工程学院学生期末项目报告

课程名称:计算机网络与编程年级:22 级上机实践成绩
指导教师:张召姓名:邓博昊学号:10225501432
上机实践名称上机实践日期:2024/3/8
上机实践编号组号上机实践时间:10:02

# 一、 题目要求

  • Task 1: 给出以下基本类型,请判断这些赋值是否正确,若有错误,请在实验报告中指出错在何处。

    char c1 = '中';
    char c2 = '哈哈';
    float f1 = 54.321;
    boolean bo1 = 1;
  • Task 2: 请在实验报告中说明以下代码段的作用

    public static int temp(int a, int b){
    return a == 0 ? b : temp(b % a, a);
    }
  • Task 3: 请在实验报告中使用控制流程打印如下图案

    image-20240308095457386

  • Task 4: 根据上面所给数组,将之排序后,使用 Arrays.binarySearch () 查找 68 ,请在实验报告中附上结果截图

    • Bonus Task1 (optional): 试分析 Arrays.sort (int []) 和 Arrays.sort (Integer []) 时有何差异
    数组:[18, 62, 68, 82, 65, 9]
  • Task 5:试运行下列代码,在实验报告中附上结果截图,首先详细阐述 == 和 equals () 的区别,然后查阅相关资料依次说明原因

    public class HelloWorld {
    public static void main(String[] args) {
    String str1 = "the light";
    String str2 = str1;
    String str3 = new String(str1);
    String str4 = "the light";
    String str5 = "the "+"light";
    System.out.println( str1 == str2);
    System.out.println( str1 == str3);
    System.out.println( str1 == str4);
    System.out.println( str1 == str5);
    System.out.println( str1.equals(str4));
    6. I/O
    6.1 Scanner 读取控制台输入的字符串
    6.2 PrintWriter输出到控制台
    PrintWriter 是缓存字符输出流 通过 flush() 将缓存区的内容刷出
    }
    }
  • Task6: 请在实验报告中分析 Scanner 内 next () 和 nextLine () 方法的区别

  • Task7: 请使用 Scanner 和 PrintWriter 编写一个从控制台输入 10 个数字将它们从小到大排序后输出至控制台的程序,请将代码和结果一起截图附在实验报告中

  • Task8: 此节需理解类和对象的概念,请在实验报告中阐述 Java 中对象被分配在哪,并列出 Java 中所有类都具有的方法

# 二、 功能实现情况

# Task 1

正确的赋值

char c1 = '中';

错误的赋值

  • Java char 类型只能存放单个字符,用单引号标注,故 char c2 = '哈哈'; 错误
  • Java float 类型变量在赋值时,需要在数字后面添加 F ,故 float f1 = 54.321; 错误,改为 float f1 = 54.321F;
  • Java boolean 类型只有两个取值, truefalse ,故 boolean bol = 1 错误
char c2 = '哈哈';
float f1 = 54.321;
boolean bo1 = 1;

# Task 2

为条件运算符,操作流程为:

  • 如果 a 等于 0 成立,则返回 b

  • 如果 a 等于 0 不成立,则递归调用 temp 函数,第一个参数为 b% a, 第二个为 a

作用:

  • 使用了递归实现欧几里得算法

  • 计算了两个整数的最大公约数

public static int temp(int a, int b){
return a == 0 ? b : temp(b % a, a);
}

# Task 3

代码如下

package cc.aquaoh;
public class week2 {
    public static void main (String[] args) {
        for(int i=1;i<=5;i++){
            for(int j=1;j<=i;j++){
                System.out.print('*');
            }
            System.out.print('\n');
        }
    }
}

运行结果

image-20240308103220749

# Task 4

代码如下

package cc.aquaoh;
import java.util.Arrays;
public class week2 {
        public static void main(String[] args) {
            int[] a = new int[] { 18, 62, 68, 82, 65, 9 };
            System.out.println("排序之前 :");
            System.out.println(Arrays.toString(a));
            Arrays.sort(a);
            System.out.println("排序之后:");
            System.out.println(Arrays.toString(a));
            System.out.println("数字68的索引值是"+Arrays.binarySearch(a,68));
    }
}

运行结果

image-20240308105212306

# Bonus Task

# int 和 Integer

  • int 是基本数据类型,int 变量存储的是数值。Integer 是引用类型,实际是一个对象,Integer 存储的是引用对象的地址
  • Integer 对象会占用更多的内存。Integer 是一个对象,需要存储对象的元数据。但是 int 是一个原始类型的数据,所以占用的空间更少。
  • 包装类 Integer 变量在与基本数据类型 int 变量比较时,Integer 会自动拆包装为 int,然后进行比较

# 自然顺序和自定义排序

  • Arrays.sort(int[]) 对整数数组按照自然顺序进行排序(即升序)。
  • Arrays.sort(Integer[]) 可以按照自然顺序或自定义顺序进行排序。

# 性能影响

  • Arrays.sort(int[]) 由于直接操作基本数据类型 int ,通常比 Arrays.sort(Integer[]) 更快,因为避免了自动装箱和拆箱的开销。
  • Arrays.sort(Integer[]) 需要在排序过程中将 Integer 对象装箱为 int 基本类型进行比较,然后再拆箱,可能会产生一定的性能开销

# Task 5

# == 和 equals

  • ==
    • 用于基本数据类型,直接比较储存的是否相等
    • 用于引用类型的变量,则比较所指向对象的地址是否相等
  • equals
    • 不能用于基本数据类型
    • Object 类 equals 方法比较的是是否为同一个对象
    • String 类 equals 方法被重写,两个字符串的所有组成字符都相等返回 true,其他情况返回 false

# String 类

  • String 创建的字符串存储在公共池中,而 new 方法创建的字符串对象在堆上
  • 不使用 new, 如果之前字符串公共池中已经存在所要创建的字符串,则不会创建新的对象,而是将变量指向字符串常量池中的对应字符串

# 结果分析

  • System.out.println( str1 == str2); , 输出为 true

    • 因为 String str2 = str1; ,则 str2 与 str1 指向的内存地址相同
    • == 用于引用类型的变量,则比较所指向对象的地址是否相等,故输出 true
  • System.out.println( str1 == str3); ,输出为 false

    • new 方法创建的字符串对象在堆上
    • String str3 = new String(str1); 则 str3 内存地址与 str1 不同,值相同
    • == 用于引用类型的变量,则比较所指向对象的地址是否相等,故输出 false
  • System.out.println( str1 == str4); ,输出为 true

    • 不使用 new, 如果之前字符串公共池中已经存在所要创建的字符串,则不会创建新的对象,而是将变量指向字符串常量池中的对应字符串
    • String str1 = "the light"; , String str4 = "the light"; ,故 str4 指向的内存地址与 str1 相同
    • == 用于引用类型的变量,则比较所指向对象的地址是否相等,故输出 true
  • System.out.println( str1 == str5); ,输出为 true

    • String str5 = "the "+"light"; 等价于 String str5 = "the light";
    • 分析同 str4
  • System.out.println( str1.equals(str4)); , 输出为 true

    • String 类 equals 方法被重写,两个字符串的所有组成字符都相等返回 true,其他情况返回 false
    • String str1 = "the light"; , String str4 = "the light"; , 显然 str1 和 str4 的字符串组成相同,故输出 true
public class HelloWorld {
public static void main(String[] args) {
String str1 = "the light";
String str2 = str1;
String str3 = new String(str1);
String str4 = "the light";
String str5 = "the "+"light";
System.out.println( str1 == str2);
System.out.println( str1 == str3);
System.out.println( str1 == str4);
System.out.println( str1 == str5);
System.out.println( str1.equals(str4));
}
}

image-20240313101840564

# Task 6

  • next 方法
    • 返回下一个以空白符分隔的字符串,不包括空白符,适用于读取单个单词或词组。
  • nextLine 方法
    • 返回整行文本,包括换行符在内,适用于读取整行输入,可以包含空格和其他特殊字符。

# Task 7

package cc.aquaoh;
import java.util.Arrays;
import java.util.Scanner;
import java.io.PrintWriter;
public class week2 {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            PrintWriter pw = new PrintWriter(System.out);
            double[] numbers = new double[10];
            for(int i=0;i<10;i++){
                numbers[i] = sc.nextDouble();
            }
            Arrays.sort(numbers);
            pw.println("排序后的数字为:");
            for(double num : numbers) {
                pw.println(num);
            }
            pw.flush();
            sc.close();
            pw.close();
    }
}

image-20240313100120647

# Task 8

# 概念

  • Class (类)
    • 类是一个模板,它描述一类对象的行为和状态。
  • Object (对象)
    • 对象是类的一个实例

# 对象的被分配位置

  • 当创建一个对象时,实际上是在内存中分配了一块区域,用于储存该对象的数据。
  • Java 中的对象存储在堆内存 (Heap) 中。

# 类所具有的方法

Java 中所有的类都继承自 java.lang.Object 类,故所有的类都具有以下方法:

  1. equals(Object obj) : 用于比较对象是否相等。
  2. hashCode() : 返回对象的哈希码值。
  3. toString() : 返回对象的字符串表示。
  4. getClass() : 返回对象的运行时类。
  5. notify() : 唤醒在该对象上等待的单个线程。
  6. notifyAll() : 唤醒在该对象上等待的所有线程。
  7. wait() : 导致当前线程等待,直到另一个线程调用该对象的 notify() 方法或 notifyAll() 方法。
  8. finalize() : 在对象被垃圾回收器回收之前调用。
  9. clone() : 创建并返回此对象的一个副本。

# 三、 性能测试情况

# 四、总结

# Task 1

  • Java char 类型只能存放单个字符,用单引号标注
  • Java float 类型变量在赋值时,需要在数字后面添加 F
  • Java boolean 类型只有两个取值, truefalse

# Task 2

  • 条件运算符
    • variable x = (expression) ? a : b
    • 如果 expression 为真,则 x = a ,反之 x = b
  • 欧几里得算法求最大公约数
    • 辗转相除法:两个整数的最大公约数等于其中较小的数和两数相除余数的最大公约数

# Task 3

  • for 循环
    • 同 C 语言中 for 循环
  • while 循环
    • 同 C 语言中 while 循环
  • 增强 for 循环
    • for(声明语句 : 表达式)
      • ** 声明语句:** 声明新的局部变量,该变量的类型必须和数组元素的类型匹配。其作用域限定在循环语句块,其值与此时数组元素的值相等
      • ** 表达式:** 表达式是要访问的数组名,或者是返回值为数组的方法。
    • 无法修改数组内元素的值

# Task 4

  • Array 类
    • 数组排序: Arrays.sort(intArray); , 默认顺序为从小到大
    • 字符串排序: Arrays.sort(strArray); 先小写后大写
    • 打印数组: Arrays.toString() 将数组中的内容全部打印出来
    • 比较数组元素是否相等: Arrays.equals(arr1,arr2) 如果 arr1 和 arr2 的元素完全相同则返回 true
    • 二分查找法找指定元素的索引值(下标): Arrays.binarySearch(arr, index) 数组一定是排好序的,否则会出错。找到元素,只会返回最后一个位置

# Bonus Task

  • int 和 Integer

    • int 是基本数据类型,int 变量存储的是数值。Integer 是引用类型,实际是一个对象,Integer 存储的是引用对象的地址
    • Integer 对象会占用更多的内存。Integer 是一个对象,需要存储对象的元数据。但是 int 是一个原始类型的数据,所以占用的空间更少。
    • 包装类 Integer 变量在与基本数据类型 int 变量比较时,Integer 会自动拆包装为 int,然后进行比较
  • 自然顺序和自定义排序

    • Arrays.sort(int[]) 对整数数组按照自然顺序进行排序(即升序)。
    • Arrays.sort(Integer[]) 可以按照自然顺序或自定义顺序进行排序。
  • 性能影响

    • Arrays.sort(int[]) 由于直接操作基本数据类型 int ,通常比 Arrays.sort(Integer[]) 更快,因为避免了自动装箱和拆箱的开销。
    • Arrays.sort(Integer[]) 需要在排序过程中将 Integer 对象装箱为 int 基本类型进行比较,然后再拆箱,可能会产生一定的性能开销

# Task 5

  • == 和 equals

    • ==
      • 用于基本数据类型,直接比较储存的是否相等
      • 用于引用类型的变量,则比较所指向对象的地址是否相等
    • equals
      • 不能用于基本数据类型
      • Object 类 equals 方法比较的是是否为同一个对象
      • String 类 equals 方法被重写,两个字符串的所有组成字符都相等返回 true,其他情况返回 false
  • String 类

    • String 创建的字符串存储在公共池中,而 new 方法创建的字符串对象在堆上
    • 不使用 new, 如果之前字符串公共池中已经存在所要创建的字符串,则不会创建新的对象,而是将变量指向字符串常量池中的对应字符串

# Task 6

  • Scanner 的 nextnextLine 方法

  • next 方法

    • 返回下一个以空白符分隔的字符串,不包括空白符,适用于读取单个单词或词组。
  • nextLine 方法

    • 返回整行文本,包括换行符在内,适用于读取整行输入,可以包含空格和其他特殊字符。

# Task 7

  • PrintWriter
    • PrintWriter 是缓存字符输出流 通过 flush () 将缓存区的内容刷出

# Task 8

  • 概念

    • Class (类)
    • 类是一个模板,它描述一类对象的行为和状态。
    • Object (对象)
    • 对象是类的一个实例
  • 对象的被分配位置

    • 当创建一个对象时,实际上是在内存中分配了一块区域,用于储存该对象的数据。
    • Java 中的对象存储在堆内存 (Heap) 中。
  • 类所具有的方法

    • Java 中所有的类都继承自 java.lang.Object 类,故所有的类都具有以下方法:

      1. equals(Object obj) : 用于比较对象是否相等。
      2. hashCode() : 返回对象的哈希码值。
      3. toString() : 返回对象的字符串表示。
      4. getClass() : 返回对象的运行时类。
      5. notify() : 唤醒在该对象上等待的单个线程。
      6. notifyAll() : 唤醒在该对象上等待的所有线程。
      7. wait() : 导致当前线程等待,直到另一个线程调用该对象的 notify() 方法或 notifyAll() 方法。
      8. finalize() : 在对象被垃圾回收器回收之前调用。
      9. clone() : 创建并返回此对象的一个副本。