Note·Interview 面经
Interview 面经
001 Spring Boot 最大的优势是什么呢?
Spring Boot 的最大的优势是“约定优于配置”。“约定优于配置”是一种软件设计范式,开发人员按照约定的方式来进行编程,可以减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。
002 Spring Boot 中 “约定优于配置“的具体产品体现在哪里?
Spring Boot Starter、Spring Boot Jpa 都是“约定优于配置”的一种体现。都是通过“约定优于配置”的设计思路来设计的,Spring Boot Starter 在启动的过程中会根据约定的信息对资源进行初始化;Spring Boot Jpa 通过约定的方式来自动生成 Sql,避免大量无效代码编写。
003 Spring Boot Starter 的工作原理是什么?
Spring Boot 在启动的时候会干这几件事情:
- Spring Boot 在启动时会去依赖的 Starter 包中寻找
resources/META-INF/spring.factories
文件,然后根据文件中配置的 Jar 包去扫描项目所依赖的 Jar 包。 - 根据
spring.factories
配置加载AutoConfigure
类。 - 根据
@Conditional
注解的条件,进行自动配置并将 Bean 注入 Spring Context。
总结一下,其实就是 Spring Boot 在启动的时候,按照约定去读取 Spring Boot Starter 的配置信息,再根据配置信息对资源进行初始化,并注入到 Spring 容器中。这样 Spring Boot 启动完毕后,就已经准备好了一切资源,使用过程中直接注入对应 Bean 资源即可。
004 Spring Boot 的自动配置是如何实现的?
Spring Boot 项目的启动注解是:@SpringBootApplication
,其实它就是由下面三个注解组成的:
- @Configuration
- @ComponentScan
- @EnableAutoConfiguration
其中 @EnableAutoConfiguration
是实现自动配置的入口,该注解又通过 @Import
注解导入了AutoConfigurationImportSelector
,在该类中加载 META-INF/spring.factories
的配置信息。然后筛选出以 EnableAutoConfiguration
为 key 的数据,加载到 IOC 容器中,实现自动配置功能。
005 JPA 和 Hibernate 有哪些区别?JPA 可以支持动态 SQL 吗?
JPA 本身是一种规范,它的本质是一种 ORM 规范(不是 ORM 框架,因为 JPA 并未提供 ORM 实现,只是制定了规范),因为 JPA 是一种规范,所以只是提供了一些相关的接口,但是接口并不能直接使用,JPA 底层需要某种 JPA 实现,Hibernate 是 JPA 的一个实现集。
JPA 是根据实体类的注解来创建对应的表和字段,如果需要动态创建表或者字段,需要动态构建对应的实体类,再重新调用 Jpa 刷新整个 Entity。动态 SQL,mybatis 支持的最好,jpa 也可以支持,但是没有 Mybatis 那么灵活。
006 SSM 概念
SSM:Spring + Spring MVC + MyBatis
- Spring 是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
- SpringMVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
- MyBatis 是一个支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。
007 Java 变量
Java 中共有三种变量,分别是类变量、成员变量和局部变量。他们分别存放在 JVM 的方法区、堆内存和栈内存中。
public class Variables {
/**
* 类变量
*/
private static int a;
/**
* 成员变量
*/
private int b;
/**
* 局部变量
*/
public void test(int c){
int d;
}
}
上面定义的三个变量中,变量 a 就是类变量,变量 b 就是成员变量,而变量 c 和 d 是局部变量。
008 REST 和 RPC
- REST(representational state transfer,表现层状态转移):使用 HTTP 协议,应用层,可以跨防火墙,在不同局域网之间通信
- RPC(remote procedure call,远程过程调用):使用 TCP 协议,传输层,速度快,但不可跨防火墙,仅支持局域网通信
结论:对内 RPC,对外 REST。
009 页面导入样式时,使用 link 和@import 有什么区别?
- link 是 HTML 标签,@import 属于 CSS 范畴。
- link 引入的样式页面加载时同时加载,@import 引入的样式需等页面加载完成后再加载。
- link 没有兼容性问题,@import 不兼容 ie5 以下。
- link 可以通过 js 操作 DOM 动态引入样式表改变样式,而 @import 不可以。
010 用递归算法实现,数组长度为 5 且元素的随机数在 2-32 间不重复的值
核心是生成随机数算法,Math.random()
函数返回一个随机浮点数,浮点数范围为左闭右开区间 [0, 1)
。
function rand(arr = [], length = 5, min = 2, max = 32) {
if (arr.length < length) {
const num = Math.floor(Math.random() * (max - min + 1)) + min
if (!arr.includes(num)) {
arr.push(num)
}
return rand(arr)
}
return arr
}
011 去除字符串中的空格,根据传入不同的类型分别能去掉前、后、前后、中间的空格
算法难点:
- 通过
Symbol()
来生成枚举类型 - 正则分组去除中间空格
const POSITION = Object.freeze({
left: Symbol(),
right: Symbol(),
both: Symbol(),
center: Symbol(),
all: Symbol()
})
function trim(str, position = POSITION.both) {
switch (position) {
case POSITION.left:
str = str.replace(/^\s+/, '')
break
case POSITION.right:
str = str.replace(/\s+$/, '')
break
case POSITION.both:
str = str.replace(/^\s+|\s+$/g, '')
break
case POSITION.center:
while (str.match(/\w\s+\w/)) {
str = str.replace(/(\w)(\s+)(\w)/, '$1$3')
}
break
case POSITION.all:
str = str.replace(/\s/g, '')
break
default:
break
}
return str
}
const str = ' s t r '
const result = trim(str, POSITION.left)
012 去除字符串中最后一个指定的字符
function delLast(str, char) {
if (!str) return false
if (!char) return str
const index = str.lastIndexOf(char)
return str.substring(0, index) + str.substring(index + 1)
}
基础语法
0x01 Java 有哪些数据类型
- 分为基本数据类型和引用数据类型。
- 基本数据类型包括:数值型(byte、short、int、long、float、double),字符型(char)以及布尔型(boolean)。除了基本类型外,其他数据类型都属于引用类型,包括类、接口、数组等。
0x02 float number=3.4;有没有问题?为什么?
有问题,因为 3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于向下转型,可能会造成精度损失,所以必须进行强制类型转换,正确的写法是 float number =(float)3.4;/ float number =3.4F;
。
0x03 字符串拼接的方式以及效率?
- 使用
+
直接拼接,String 是 final 对象,不会被修改,每次使用+
进行拼接都会创建新的对象,而不是改变原来的对象,效率低,是线程安全的。 - 使用
StringBuffer
可变字符串,效率较高,是线程安全的(StringBuffer
的方法使用了synchronized
关键字进行修饰)。 - 使用
StringBuilder
可变字符串,效率最高,但是线程不安全。
0x04 简述 final,finally 和 finalize 区别
final
可以修饰类、方法和变量,被final
修饰的类不可继承,被final
修饰的方法不可重写,被final
修饰的变量引用不可更改,引用的内容可以更改。finally
用于try-catch
代码块中,无论是否发生异常最后都将执行,作用是释放资源。finalize
是 Object 类的方法,在对象被垃圾回收之前将调用一次,一般用于资源的释放。
0x05 ==和 equals 有什么区别?equals 和 hashCode 有什么联系?
- 如果是引用类型,
==
比较的是两个对象的引用是否完全相同,如果是基本类型,比较的是两个基本类型的数值是否相同。 - 如果没有重写的话,
equals
默认按照==
进行比较,如果重写了equals()
方法,则按照对应的比较规则比较。 - 两个对象如果相等,那么它们的 hashCode 值必须相等,但两个对象的 hashCode 值相等时,它们不一定相同。
金点网络-全网资源,一网打尽 » Note·Interview 面经
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。
- 是否提供免费更新服务?
- 持续更新,永久免费
- 是否经过安全检测?
- 安全无毒,放心食用