笔试题-2021-11-23
Xplorist Lv6

笔试题-2021-11-23

reference-site-list

选择题

1.下面关于java.lang.Exception类的说法正确的是()

A. 继承自Throwable

B. Serialable

C. 继承Error

D. 实现Throwable

  • 答案:A
  • 解析:Exception源码
    1
    2
    3
    4
    public class Exception extends Throwable {
    static final long serialVersionUID = -3387516993124229948L;
    // ...
    }

2.下面程序的运行结果是()

1
2
3
String str1 = "hello";
String str2 = "he" + new String("llo");
System.err.println(str1 == str2);

A. true B. false

  • 答案:B
  • 解析:考察 == 的作用,判断的是字符串引用的地址是否相同,str1在常量池中,str2是用new String(“llo”)再去分配了新的堆空间,所以str2存在堆空间上
  • 参考网址:牛客网 - String str1=”hello”;

3.下列说法正确的是()

A. class中的constructor不可省略

B. constructor必须与class同名,但方法不能与class同名

C. constructor在一个对象被new时执行

D. 一个class只能定义一个constructor

  • 答案:C
  • 解析:
    • A. 类中无构造方法,默认有一个空的构造方法
    • B. 普通方法可以和类同名,但是要有void返回值
    • D. 一个类可以有多个构造方法

4.选项中哪一行代码可以替换题目中// add code here 而不产生编译错误()

1
2
3
4
5
6
public abstract class MyClass{
public int constInt = 5;
// add code here
public void method() {
}
}

A. public abstract void method(int a);

B. constInt = constInt + 5;

C. public int method();

D. public abstract void anotherMethod() {}

  • 答案:A
  • 解析:
    • B. 这个是运算,运算只能在方法体中进行
    • C. 这个和返回值void的方法重名了,返回值不同,不算重载
    • D. 抽象方法不能有方法体

5.运行以下代码的结果是什么()

1
2
3
4
public static void main(String[] args) {
Integer f1 = 100, f2 = 100, f3 = 150, f4 = 150;
System.out.println((f1 == f2) + "," + (f3 == f4));
}

A. true, false

B. false, false

C. true, true

D. false, true

  • 答案: A
  • 解析:
    • JVM会自动维护八种基本类型的常量池,int常量池中初始化-128127的范围,所以当为Integer i=100时的属于128127的范围内时,在自动装箱的过程中取的是常量池中的数值,所以f1和f2都是常量池中的地址,所以f1 == f2返回true,
    • 而150超过了常量池的范围,f3,f4都是在堆上重新分配的空间,地址当然不一样,所以f3 == f4 返回false。

编程题

1.请写出线程安全的懒汉单例模式

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Singleton {
private static volatile Singleton instance;
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}

解析: 注意线程安全的要求,要使用双检锁单例


2.用一条SQL语句查询出每门课(没考的不统计)都大于80分的学生姓名

name course score (表名为t_score)
张三 语文 81
张三 数学 75
李四 语文 76
李四 数学 90
李四 英语 0
王五 语文 81
王五 数学 100
王五 英语 90

1
SELECT t.name FROM sql_test.t_score t group by t.name having min(t.score) > 80;

解析: 考察的是分组统计,group by - having,经典考题了


简答题

1.项目中动静分离有什么好处?

1
2
3
4
5
6
api接口服务化:动静分离之后,后端应用更为服务化,只需要通过提供api接口即可,可以为多个功能模块甚至是多个平台的功能使用,可以有效的节省后端人力,更便于功能维护。

前后端开发并行:前后端只需要关心接口协议即可,各自的开发相互不干扰,并行开发,并行自测,可以有效的提高开发时间,也可以有些的减少联调时间

减轻后端服务器压力,提高静态资源访问速度:后端不用再将模板渲染为html返回给用户端,且静态服务器可以采用更为专业的技术提高静态资源的访问速度。

参考网址:动静分离


2.事务的隔离级别有哪些?Spring事务中的默认隔离级别是什么?

1
2
3
4
5
6
7
8
ANSI SQL标准定义了4种事务隔离级别来避免3种数据不一致的问题。事务等级从高到低,分别为:

1.Serializable(序列化)
2.Repeatable read(可重复读)
3.Read Committed(已提交读)
4.Read Uncommitted(未提交读)

Spring 中 ISOLATION_DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.

参考网址:


3.什么事SpringBoot, SpringBoot有什么好处?

1
2
3
4
在使用传统的Spring去做Java EE(Java Enterprise Edition)开发中,大量的 XML 文件存在于项目之中,导致JavaEE项目变得慢慢笨重起来,,繁琐的配置和整合第三方框架的配置,导致了开发和部署效率的降低。

Spring Boot 并不是用来替代 Spring 的解决方案,而是和 Spring 框架紧密结合用于提升 Spring 开发者体验的工具。同时它集成了大量常用的第三方库配置,Spring Boot应用中这些第三方库几乎可以是零配置的开箱即用(out-of-the-box),大部分的 Spring Boot 应用都只需要非常少量的配置代码(基于 Java 的配置),开发者能够更加专注于业务逻辑。

参考网址:


4.Spring AOP的理解

1
2
3
4
AOP(Aspect-Oriented Programming,面向切面编程),可以说是OOP(Object-Oriented Programing,面向对象编程)的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。当我们需要为分散的对象引入公共行为的时候,OOP则显得无能为力。也就是说,OOP允许你定义从上到下的关系,但并不适合定义从左到右的关系。例如日志功能。日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。对于其他类型的代码,如安全性、异常处理和透明的持续性也是如此。这种散布在各处的无关的代码被称为横切(cross-cutting)代码,在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

而AOP技术则恰恰相反,它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其名为“Aspect”,即切面。所谓“切面”,简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。AOP代表的是一个横向的关系,如果说“对象”是一个空心的圆柱体,其中封装的是对象的属性和行为;那么面向方面编程的方法,就仿佛一把利刃,将这些空心圆柱体剖开,以获得其内部的消息。而剖开的切面,也就是所谓的“方面”了。然后它又以巧夺天功的妙手将这些剖开的切面复原,不留痕迹。

参考网址:


5.假设有一个池塘,里面有无穷多的水,现有2个空水壶,容积分别为5升和6升,问题是如何只用这2个水壶从池塘里取得3升的水。

1
2
3
4
5
5L 装满,倒进6L 0,5L
5L装满,倒满6L壶 4,6L
倒空6L,5L剩余水倒入6L 0,4L
5L装满,倒满6L壶 3,6L
这时5L壶中的是3L水

参考网址:

 评论