考试时间下午15:40~17:40分 共计2个小时

  1. 周考的目的是检验我们本周学习效果的一种方式,除了讲师知道大家的学习情况外,也可以检验一下自身的学习情况,做到查漏补缺,切勿作弊!

一、简答题(40分)

1、简述OOM异常

  1. 很多同学都没有回答完全:
  2. OOM异常属于内存溢出异常:
  3. 分为栈溢出、堆溢出、以及元空间(永久代)溢出。一般常见的是堆内存溢出。可以通过调整堆大小来解决。
  4. 默认堆大小是最小内存是物理机器内存的1/64,最大内存是物理机器的1/4;

2、说说JVM中的堆

  1. 分为三个区:新生区,养老区,永久区。1.8以后没有了永久区,变成了元空间。
  2. 新生区分为:伊甸区,0区,1区。每当达到70%时进行小GC,将伊甸区和from区中的有用数据复制到to区。
  3. 经过15次小GC的数据存储到养老区。

3、简述JVM中的垃圾回收算法

  1. 1、复制算法:将数据复制到不删除的地方,优点是效率高,缺点是浪费内存且不适合频繁GC
  2. 2、标记-清除算法:扫描标记,在扫描删除。优点是节约内存,缺点是效率低,会产生碎片垃圾。
  3. 3、标记-整理算法:扫描标记删除后压缩在一起。优点是不会产生垃圾,缺点是效率低。
  4. 没有最好的算法,所以最好使用分代整理算法。

4、简述JVM中方法区都可以存储哪些内容

  1. class 信息,静态方法,静态变量。1.6及以前存储常量池

二、编程题(60分)

1、Stream流编程题(20分)

有如下List集合:

  1. List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
  2. 1、空字符串数量
  3. 2、字符串长度为 3 的数量
  4. 3、获取2题目筛选后的列表
  5. 4、合并字符串

参考代码:

  1. List<String> strings = Arrays.asList("abc", "", "bc", "efg", "abcd","", "jkl");
  2. Stream<String> stream = strings.stream();
  3. stream.filter(String::isEmpty);// str.equals("")
  4. stream.filter(s -> {
  5. if (s.length() == 3) {
  6. return true;
  7. }return false;
  8. }).collect(Collectors.toList());
  9. String mergedString = strings.stream().filter(string -> !string.isEmpty()).reduce((s1, s2) -> s1 + s2);
  10. System.out.println("合并字符串: " + mergedString);
  1. List<Integer> integers = Arrays.asList(1,2,13,4,15,6,17,8,19);
  2. 1、求每个数字立方后的list集合
  3. 2、列表中最大的数
  4. 3、列表中最小的数
  5. 4、所有数之和
  6. 5、平均数
  1. List<Integer> integers = Arrays.asList(1,2,13,4,15,6,17,8,19);
  2. IntSummaryStatistics stats = numbers.stream().mapToInt((x) -> x).summaryStatistics();
  3. System.out.println("列表中最大的数 : " + stats.getMax());
  4. System.out.println("列表中最小的数 : " + stats.getMin());
  5. System.out.println("所有数之和 : " + stats.getSum());
  6. System.out.println("平均数 : " + stats.getAverage());

2、在控制台模拟登陆注册功能。(40分)

欢迎来到农联天下商城,请选择操作:
1)登陆
2)注册
当用户进行注册时,输入账户和密码,我们判断该账户和密码是否重复,如果重复,提示用户重新注册。如果没有重复的,就保存,将账户和密码信息保存至磁盘上。
当用户登录是,用户输入账户和密码,查看注册列表中是否有该账户的信息,如果比对成功,提示登录成功,如果不存在,提示登录失败。
提示:以上操作可以使用IO流(对象序列化,List 或者Map)
以下为李欣阳同学的答案,符合题意,考虑到了多用户的情况:

package com.qfedu.day13.TestWeek;

import java.io.Serializable;
import java.util.Objects;


public class User implements Serializable {
    private String name;
    private String password;

    public User() {
    }

    public User(String name, String password) {
        this.name = name;
        this.password = password;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return Objects.equals(name, user.name) && Objects.equals(password, user.password);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, password);
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }
}
package com.qfedu.day17;

/**
 * @Author laoyan
 * @Description TODO
 * @Date 2022/3/26 17:52
 * @Version 1.0
 */

import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;


public class Test3 {
    public static void main(String[] args) {
        startMenu();
    }

    public static void zuche(File file) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入用户名");
        String name = scanner.next();
        System.out.println("请输入密码");
        String password = scanner.next();
        User user = new User(name, password);

        ArrayList<User> users = getUserList(file);
        if (users.contains(user)) {
            System.out.println("该账号已存在,请更换后注册");
        } else {
            users.add(user);

            try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(file))) {
                // 说明是新文件,没有对象
                objectOutputStream.writeObject(users);
                objectOutputStream.flush();
                System.out.println("注册成功");
            } catch (Exception e) {
                e.printStackTrace();
                System.err.println("注册失败");
            }
        }


    }

    public static ArrayList<User> getUserList(File file) {

        if (!file.exists()) {

            return new ArrayList<User>();
        } else {
            try (ObjectInputStream objectInputStream = new ObjectInputStream(new FileInputStream(file))) {
                Object o = objectInputStream.readObject();
                if (o != null && o instanceof ArrayList) {
                    ArrayList<User> users = (ArrayList<User>) o;
                    return users;
                }

            } catch (Exception e) {
                e.printStackTrace();

            }
        }

        return null;

    }

    public static void denglu(File file) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入用户名");
        String name = scanner.next();
        System.out.println("请输入密码");
        String password = scanner.next();
        User user = new User(name, password);


        ArrayList<User> users = getUserList(file);
        if (users.contains(user)) {
            System.out.println("登录成功!");
        } else {
            System.out.println("登录失败");
        }
    }

    public static void startMenu() {
        Scanner scanner = new Scanner(System.in);
        System.out.println("1)登录");
        System.out.println("2)注册");
        System.out.println("3)退出");
        File file = new File("C:\\Users\\User\\Desktop\\a.txt");
        int n = scanner.nextInt();
        switch (n) {
            case 1:
                denglu(file);
                startMenu();
                break;
            case 2:
                zuche(file);
                startMenu();
                break;
            case 3:
                break;
            default:
                System.out.println("请重新输入");
                startMenu();
        }
    }
}