成都协能共创科技有限公司2019面试题

面试时间: 2019-4-2

一、逻辑题

  1. 1元钱一瓶汽水,喝完后两个空瓶换一瓶汽水,问:你有20元钱,最多可以喝到几瓶汽水?
    答:

    1
    2
    3
    4
    5
    6
    7
    8
    20
    20/2 = 10
    10/2 = 5
    5/2 = 2...1
    2/2 = 1
    1+1 = 2*
    2/2 = 1
    20 + 10 + 5 +2 + 1 + 1 = 39
  1. ABC三人都喜欢说谎话,有时候也说真话。某天,A指责B说谎话,B指责C说谎话,C说AB两人都在说谎。
    后来上帝通过读心术知道其中至少一个人说的是真话。请问谁在说真话?
    答:可以先假设A说真话,那么B是说谎的;根据B是说谎的,那么C说的是真话;而C说,AB都说谎,与A说真话相矛盾。

    所以A说谎。
    据此,那么B说的是真话;C说的是谎话。

  2. 1,11,21,1211,111221,_,下一个数是什么?
    答:312211

  • 1 读为: 1个1,提取数字11(即为第二个数);
  • 11 读为: 2个1,提取数字21(即为第三个数);
  • 21 读为: 1个2、1个1,提取数字1211(即为第四个数);
  • 1211 读为:1个1、1个2、2个1;提取数字111221(即为第四个数);
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    public class Demo {
    public static void main(String[] args) {
    int count = 6;
    String[] str = new String[count];
    str[0] = "1";
    str[1] = "11";
    int j;
    StringBuilder result;
    for (int i = 2; i < count; i++) {
    char[] pri = str[i - 1].toCharArray();
    int n;
    result = new StringBuilder();
    j = 0;
    for (n = 0; n < pri.length - 1; n++) {
    if (pri[n] == pri[n + 1]) {
    j++;
    } else {
    j++;
    result.append(j);
    result.append(pri[n]);
    j = 0;
    }
    }
    j++;
    result.append(j);
    result.append(pri[n]);
    str[i] = result.toString();
    }
    for (int i = 1; i <= count; i++) {
    System.out.println(i + "个数: " + str[i-1]);
    }
    }
    }
  1. 一个家庭有两个小孩,其中有一个是女孩,问另一个也是女孩的概率(假定生男生女的概率一样)?
    答:
    (1/21/2)/(1-1/21/2)
    =(1/4)/(3/4)
    =1/3
  2. 假设有一个池塘,里面有无穷多的水。现有2个空水壶,容积分别为5升和6升。
    问题是如何只用这2个水壶从池塘里取得3升的水?
    答:
  • 将5L桶装满水,倒入6L桶,此时6L桶有5L水;
  • 再次将5L桶装满水,倒入6L桶,6L水满,5L桶还剩4L水;
  • 将6L桶的水倒空,将5L桶中剩余的4L水倒入6L桶,此时6L桶有4L水;
  • 将5L桶再次装满水,将6L桶的水注满,5L桶剩余3L水。
    全过程用水15L。

    二、填空题

  1. 构造函数Constructor是否可被override?_
    答:构造器不能被继承,因此不能被重写,但可以被重载(overload)
  2. 基本数据类型包括_
    答:byte short int long boolean char float double
  3. static方法内部是否可以调用非static方法?
    答:static 方法是静态方法,是属于类的方法,非 static 方法是属于对象的方法
  4. Java源文件中最多只能有一个_类,其他类的个数不限。
    答:public
  5. 是否可以继承String类?
    答:不可以,String类被final修饰,不可以修改
  6. 从线程安全的角度考虑,HashTable是_,HashMap是_
    答:安全,不安全
  7. _方法比较两个类型为String的字符串值是否相等
    答:equals()
  8. Tomcat的核心配置文件是_
    答:/conf/server.xml
  9. Java是通过_来处理内存分配与释放的底层操作
    答:jvm虚拟机(可能是此答案)
  10. final StringBuffer a = new StringBuffer(“immutable”);其中a是否可以被修改?
    a.append(“broken!”);是否能够编译通过?是否能执行?
    答: 不能被修改,可以编译通过,可以执行

三、选择题

  1. 下列说法正确的有(C)
    A. class中的constructor不可省略
    B. constructor必须与class同名,但方法不能与class同名
    C. constructor在一个对象被new时执行
    D. 一个class只能定义一个constructor

  2. 关于用关键字private修饰的成员变量,下列说法正确的是(B)
    A. 只能被同一个包中的其他类访问
    B. 只能被该类自身所访问或修饰
    C. 可以被其他包的类访问
    D. 可以被其他包中的该类的子类访问

  3. 下列关于栈的描述中错误的是(B)
    A. 栈是先进后出的线性表
    B. 栈只能顺序存储
    C. 栈有记忆作用
    D. 对栈的插入与删除操作中,不需要改变栈底指针

  4. 下列说法错误的有(BCD)
    A. 数组是一种对象
    B. 数组属于一种原生类
    C. int number=[]={31,23,33,43,35,61}
    D. 数组的大小可以任意改变

  5. 下列异常处理语句编写正确的是(D)
    A. try{ System.out.println(2/0);}
    B. try(System.out.println(2/0))catch(Exception e)(System.out.println(e.getMessage());)
    C. try { System.out.println(2 / 0); }
    D. try { System.out.println(2 / 0); }catch (Exception e){ System.out.println(e.getMessage()); }

6.如下描述正确的是(A)
A. 一个java中只能有一个class是public的
B. 如果一个类的构造方法是私有的,那么实例化此类就需要有一个非私有的方法
C. protected的方法无法被子类访问
D. abstract类不可以直接实例化

  1. 下列叙述中,正确的是(A)
    A. Java语言的表示度是区分大小写的
    B. 源文件与public类名可以不相同
    C. 源文件拓展名为.jar
    D. 源文件中public类的数目不限

  2. 下面程序的运行结果是(B)
    注意:java虚拟机会优化字符串拼接,String str2 = “he” + “llo”;时为true
    String str1 = “hello”;
    String str2 = “he” + new String(“llo”);
    System.err.println(str1==str2);
    A. true
    B. false
    C. 编译不通过
    D. 产生运行时异常

  3. 下面说法正确的是(D)
    注意:接口不能被直接实例化,jdk9中接口中可以定义私有方法
    A. 用new关键字实例化接口,必须实现接口中的所有抽象放方法
    B. 接口中不可以定义私有方法
    C. 接口中可以定义私有属性
    D. 类可以实现多个接口

  4. 按照学生平均成绩(avg_grade)将students表中的数据检索出来,下面SQL语句正确的是(ACD)
    注意:分组为ORDER BY,不是GROUP BY
    A. SELECT FROM students ORDER BY avg_grade
    B. SELECT
    FROM students GROUP BY avg_grade ASC
    C. SELECT FROM students ORDER BY avg_grade DESC
    D. SELECT
    FROM students ORDER by avg_grade asc

四、问答以及编程题

  1. 简述Overload和Override的区别
    Override(重写,覆盖):
  • 方法名、参数、返回值相同
  • 子类方法不能缩小父类方法的访问权限
  • 子类方法不能抛出比父类方法更多的异常(但子类方法可以不抛出异常)
  • 存在于父类和子类之间
  • 方法被定义为final不能被重写
    Overload(重载,过载):
  • 参数类型、个数、顺序至少有一个不相同
  • 不能重载只有返回值不同的方法名
  • 存在于父类和子类、同类中
  1. 简单描述一下什么是抽象类(abstract class)和接口(interface)
  • 一个类可以实现多个接口,但是却只能继承最多一个抽象类;
  • 抽象类可以包含具体的方法,接口的所有方法都是抽象的;
  • 抽象类可以声明和使用字段;接口则不能,但接口可以创静态的final常量;
  • 接口的方法都是public的,抽象类的方法可以使public,private,protecte或者是默认的packag;
  • 抽象类可以定义构造函数,但是接口不行。
  1. 说出下面程序运行的结果
    执行结果:

    static A
    static B
    I’m A class
    HelloA
    I’m B class
    HelloB

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    class HelloA {
    public HelloA() {
    System.out.println("HelloA");
    }

    {
    System.out.println("I'm A class");
    }

    static {
    System.out.println("static A");
    }
    }

    public class HelloB extends HelloA {
    public HelloB() {
    System.out.println("HelloB");
    }

    {
    System.out.println("I'm B class");
    }

    static {
    System.out.println("static B");
    }

    public static void main(String[] args) {
    new HelloB();
    }
    }
  2. 第一个人10岁,第2个比第一个人大2岁,依次递推,请用递归方式计算出第8个人多大?

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    public class Demo {
    public static void main(String[] args) {
    System.out.println(computeAge(8));
    }

    private static int computeAge(int i) {
    if (i == 1) {
    return 10;
    }
    return computeAge(i - 1) + 2;
    }
    }
  3. 请阐述一下为什么会出现以下结果
    答:main是主线程的线程名,Thread-1是子线程的线程名,Thread.currentThread().getName()是获得当前线程名,当前是主线程,子线程执行的代码是在run()方法中
    执行结果:
    Main:main
    Thread-1

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class MultiThread {
    public static void main(String[] args) {
    MyThread mt = new MyThread();
    mt.start();
    System.out.println("Main:"+Thread.currentThread().getName());
    }
    }
    class MyThread extends Thread{
    @Override
    public void run(){
    System.out.println(getName());
    }
    }

五、附加题

  1. 简述Http的请求格式,以及GET和POST的区别
    答:
    http请求格式:请求行 + 请求头 + 数据体
    请求行包含三个内容 method + request-URI + http-version
    method 包含有 post , get, head,delete, put, connect, options, patch, propfind, propatch, mkcol, copy, move, lock, unlock, trace, head

GET和POST的区别:

  • GET请求在URL中传送的参数是有长度限制的,而POST没有。
  • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。
  • GET参数通过URL传递,POST放在Request body中。
  • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。
  • GET请求只能进行url编码,而POST支持多种编码方式。
  • GET请求会被浏览器主动cache,而POST不会,除非手动设置。
  • GET产生的URL地址可以被Bookmark,而POST不可以。
  • GET在浏览器回退时是无害的,而POST会再次提交请求。

其实,GET和POST本质上两者没有任何区别。他们都是HTTP协议中的请求方法。底层实现都是基于TCP/IP协议。
上述的所谓区别,只是浏览器厂家根据约定,做得限制而已。
HTTP请求,最初设定了八种方法。这八种方法本质上没有任何区别。只是让请求,更加有语义而已。

  • OPTIONS 返回服务器所支持的请求方法
  • GET 向服务器获取指定资源
  • HEAD 与GET一致,只不过响应体不返回,只返回响应头
  • POST 向服务器提交数据,数据放在请求体里
  • PUT 与POST相似,只是具有幂等特性,一般用于更新
  • DELETE 删除服务器指定资源
  • TRACE 回显服务器端收到的请求,测试的时候会用到这个
  • CONNECT 预留,暂无使用
  1. 简述一下synchronized同步块和同步方法的原理