格力2020秋招后端笔试题解析

  1. Java编译器会将Java程序转换为

    字节码

    • jVM虚拟机的运行流程如下
      1. java编译器将java源文件编译为字节码文件(.class文件)
      2. 类加载器将字节码文件加载到JVM内存中
      3. 执行引擎把字节码转换为可执行机器码
      4. CPU结合本地库接口执行机器码
  2. 给出如下代码,请修改后是程序正常运行:

    将private int m 改为 static int m

    class Test {
        private int m;
        public static void fun() {
            System.out.println(m);
        }
    }
    
    • JVM内存存储类型:

      • stack segment(栈区):
        • 基本数据类型的变量
        • 自定义的对象的引用(不是具体对象,对象本身存储在堆区)
        • 被执行的方法
      • heap segment(堆区):
        • 各种各样的对象,每个对象都包含一个与之对应的class信息。(class的目的是得到操作指令)
      • code segment(代码区)
        • 类中的方法,无论静态还是非静态
      • data segment(数据区)
        • static的变量或者字符串常量存储在数据区
    • static和非static变量的区别和特点

      1. 存放位置不同

        static存放在数据区,而非static根据其类型存储在堆区或者栈区。

      2. 访问权限不同

        • static变量是全局的,类的所有对象、所有方法不管是static或者非static都能访问static。
        • 非static变量是私有的,非static变量访问非static变量具体看访问修饰符,非static变量不能被static变量访问。
        • 方法中声明的变量可以与非static变量并且是类的属性重名
        • static方法中声明的变量可以与非static变量并且是类的属性重名
        • (因为类的属性是存在堆区中的,而方法中的变量存在代码区中,在不同的区中可以重名)
  3. 下列叙述正确的是(D

    a. 子类可以访问父类的所有成员

    b. 除了继承父类的成员以外,子类不可以创建自己的成员

    c. 当实例化子类时,父类的构造方法不被调用

    d. 子类只能访问父类的非私有成员

    • 修饰符的作用:

      访问修饰符\作用范围所在类同一包内其他类其他包内子类其他包内非子类
      private×××
      default××
      protected×
      public
    • 子类可以继承父类的所有成员,但是只能访问父类的非私有成员

    • 子类不能重写子类的构造方法;当实例化子类时,父类的构造方法会在子类的构造方法里被调用

  4. int x = 5, y = 7;
    void swap() {
    	int z;
    	z = x;
    	x = y;
    	y = z;
    }
    
    int main(void) {
    	int x = 3, y = 8;
    	swap();
    	printf("%d, %d\n", x, y);
    }
    

    正确的输出结果为:3,8

    • swap函数并没有传参,所以调换的只是全局变量的x和y,而对main函数中的无影响,而在函数内默认先调用局部变量
  5. 下列关于B/S架构软件与C/S架构软件的区别描述错误的是D

    a. B/S输入C/S,浏览器只是特殊的客户端

    b. C/S可以使用任何通信协议,而B/S这个特殊的C/S架构规定必须实现HTTP协议;

    c. C/S架构的劣势还有高昂的维护成本且投资大

    d. C/S架构维护和升级方式简单

    • BS架构的CS架构的区别
      • BS对计算机配置要求较低,而CS则要求较高
      • BS不用安装任何专门软件,一个浏览器就可以访问各种服务器;而CS架构每个客户端都必须安装和配置专用软件
      • CS架构每个客户端都需要进行升级维护,否则将无法使用;而BS只需要维护服务器即可
      • CS架构对权限有多层校验,提供了更安全的存取模式
    • 另外,BS必须实现HTTP协议这个,在早期的互联网中适用,现在已经有了多种协议可以适应BS架构,不是必须要实现HTTP协议,但是HTTP协议依旧是BS架构的主流
  6. 下面关于系统调用的描述中,错误的是B

    a. 系统调用把应用程序的请求传授给系统内核执行

    b. 系统调用中被调用的过程运行在“用户态”中

    c. 利用系统调用能够得到操作系统系统的多种服务

    d. 是操作系统提供给编程人员的接口

    • 什么是系统调用?

      操作系统提供用户一种特殊的接口(API),用户通过这组特殊的接口来获操作系统内核服务提供的服务。

    • 为什么用户程序不能直接访问系统内核提供的服务?

      在系统中,为了更好地保护内核空间,将程序的运行空间分为内核空间和用户空间(也就是常称的内核态和用户态),它们分别运行在不同的级别上,在逻辑上是相互隔离的。

    • 系统调用的逻辑过程?

      当用户空间的进程需要获得一定的系统服务时,应用程序调用系统调用,这时操作系统就根据系统调用号(每个系统调用被赋予一个系统调用号)使用户进程进入内核空间的具体位置调用相应的内核代码。进行系统调用时,程序运行空间需要从用户空间进入内核空间,处理完后再返回到用户空间。

  7. 设已经有A,B,C,D四个类的定义,程序中A,B,C,D析构函数调用顺序为ABDC

    C c;
    void main() {
    	A *pa = new A();
    	B b;
    	static D d;
    	delete pa;
    }
    
    • 这个题是C++的题,但是也可以做
    • 对于A为自行new的对象,手动释放,所以优先释放
    • 对于B,是在栈中的引用,在main函数结束后就释放
    • 对于C,作为一个类建立在静态存储区,对于c在程序结束时释放
    • 对于D,也存储在静态存储区,在程序结束时释放,但是由于C是全局对象,初始化在main函数之前,所以析构函数在最后调用,D在其前
  8. mysql中,结果集满足联结条件,该联结是内连接

    • mysql的联结:
      • 内连接:包括等值连接(通过等号连接两侧)、非等值连接(通过非等号连接两侧)、自连接(连接的两个表为同一个),只有满足条件时才会被包含在结果集内
      • 左连接:即使右表中没有匹配,也从左表返回行
      • 右连接:即使左表中没有匹配,也从右表返回行
      • 全连接:只要其中一个表中存在匹配,则返回行
  9. 已知有序序列b c d e f g q r s t,则在二分查找关键字b的过程中,先后进行比较的关键字依次是多少?fcb

    • 二分当遇到偶数时,要么用 n / 2 + 1定位,要么用 n / 2 - 1 定位,但是不管用哪一种,程序从始至终都是那一种,

      假如用n / 2 + 1,那么顺序将会是 g, d, c, b

      假如使用n / 2 - 1,那么顺序将会是f, c, b

  10. 冒泡排序:

    int* func(int* num, int n){
    
        for(int i = 0; i < n; i++){
            for(int j = 0; j < n - 1 - i; j++){
                if(num[j] >= num[j + 1]){
                    int temp = num[j];
                    num[j] = num[j + 1];
                    num[j + 1] = temp;
                }
            }
        }
    
        return num;
    
    }
    
    • 线程:线程是程序中的执行流,每个线程都有自己的专有寄存器(栈指针、程序计数器等),但代码区是共享的,即不同的线程可以执行同样的函数。
    • 多线程:是指程序中包含多个执行流,即在一个程序中可以同时运行多个不同的线程来执行不同的任务,也就是说允许单个程序创建多个并行执行的线程来完成各自的任务。

Q.E.D.


If you don't come, I will snow.