面试题汇总
JeecgBoot
1 | 邮件格式: |
技术栈
前端
Html+Js+Css
ES6
Web API
Web API 接口参考 | MDN (mozilla.org)
工具
codemirror 代码编辑器
clipboard.js — Copy to clipboard without Flash (clipboardjs.com)
Vue、Vuex、Vue-router
https://cn.vuejs.org/index.html
Ant-design-vue
https://1x.antdv.com/docs/vue/introduce-cn/
uniapp
微信小程序
https://developers.weixin.qq.com/miniprogram/dev/framework
Vant 移动端组件
Vant 2 - 轻量、可靠的移动端组件库 (gitee.io)
地图
- Leaflet
图表
- echarts、highcharts、dataV
3D 可视化
WebGL、Three.js
包管理器
- npm、cnpm、yarn
打包工具:Webpack
https://www.webpackjs.com/guides/
https://www.bilibili.com/video/av90152963?p=2
开发工具:VSCode、IDEA、HBuilderX
调试技巧
- 调试技巧
- 输出日志
- 断点、条件断点
- 网络请求
- 应用缓存
- Css 样式调试
- 禁止Web调试工具 disable-devtool
android【已过时不再使用】
原生 + H5 页面「app 本地页面 + 互联网页面」
5+App【已过时不再使用】
MUI + H5Plus + Native.js
后端
- Java基础
- 多线程、注解、泛型、枚举、反射、定时、排序、集合等
- Java8 引入的 Lambda、Stream
- Java 开发规范:《Java开发手册.pdf》
- 编程时遵循设计原则和最佳实践,按需引入设计模式
- SpringBoot、Shiro、JWT
- SpringCloud
ORM框架
MyBatis
MyBatis-Plus https://baomidou.com/
Spring Boot Jpa
Spring Boot Jpa 是 Spring 基于 ORM 框架、Jpa 规范的基础上封装的一套 Jpa 应用框架
DB连接池
- Druid https://github.com/alibaba/druid
- HikariCP、C3P0、DBCP
日志框架
SLF4J-日志门面、Logback-日志框架
SwaggerUI
- Swagger UI是一个流行的开源API文档和测试工具
HttpClient 工具
- RestTemplate https://zhuanlan.zhihu.com/p/31681913
Excel处理
- POI、jxl
- EasyExcel https://github.com/alibaba/easyexcel
Word模板引擎
- Poi-tl Documentation (deepoove.com) 使用Word模板和数据创建很棒的Word文档
定时调度
- Spring scheduled
- Quartz
- xxl-job
编程工具包
模板引擎
数据库
- MySQL、Oracle、SQLServer、H2
- 国产 DM
- MongoDB
- Redis
- Ehcache https://juejin.im/post/5d00522a6fb9a07ee63f5d3f
全文检索
ElasticSearch
官网:https://www.elastic.co/cn/products/elasticsearch
入门:https://www.ruanyifeng.com/blog/2017/08/elasticsearch.html
MySQL8 支持创建全文检索字段 FULLTEXT
消息队列
- RabbitMQ
- Kafka
文件服务
- Minio
- Oss
- FastDFS
工作流
- Activiti
- Flowable
运维平台
Docker
K8s
工具
Postman
IDEA:常用插件「IDEA-plugins」、调试技巧、远程调试、书签、ToDo、Database
Web容器
- Nginx
- Apache、IIS
Servlet 容器
- Tomcat
- HTTP服务器和Servlet引擎
- Jetty
- Jetty是一个开源的HTTP服务器和Servlet引擎,它可以为JSP和Servlet提供运行时环境。相对于Tomcat,jetty更加轻量、更加简易、更加灵活
- jetty是异步的,支持更高的并发量
- Jetty 默认采用的 NIO 模型,jetty能很好支持长链接
- Undertow https://segmentfault.com/a/1190000020668553
- 高并发能力
- Weblogic
项目管理
禅道
Java
HashMap 的 merge(k, v, function) 函数
该函数作用与 put(k, v) 一致,但当 Key 重复的时候,可以自定义处理元素值
示例
1
2
3
4HashMap<String, Integer> map = new HashMap<String, Integer>() {{
put("key", 1);
}};
map.merge("key", 2, (oldVal, newVal) -> oldVal + newVal);
Comparator
Java Comparator 是一个函数式接口,用于比较两个对象。
Comparator 接口定义了一个 compare() 方法,该方法接受两个参数,返回一个整数,表示第一个参数是否小于、等于或大于第二个参数。如果第一个参数排序字段值大于第二个参数的且返回 1,则为升序。返回 -1 则为降序
静态内部类
静态内部类是指在一个非静态类中定义的静态成员类
静态内部类中可以访问外部类中的静态成员变量和静态方法,无法访问非静态成员和方法
静态内部类实例化对象必须通过「外部类.内部类」方式
1 | public class OuterClass { |
Java8
Lambda 是什么?
Lambda 表达式是Java 8中引入的一种新的特性,可以简化代码的书写,提高代码的可读性和可维护性
Lambda 表达式表达的是一个匿名接口函数的实现
Lambda表达式的语法由三个部分组成:函数参数、箭头符号(->)和函数体。函数的参数类型和返回值类型都可以省略,程序会根据接口定义的上下文自动确定数据类型
Stream 是什么?
- Stream 是Java 8中引入的一种新的特性,它可以将数组、集合、文本文件数据转换成管道数据流的形式,进行各种操作,例如过滤、映射、排序等
- Stream API 可以极大地提高Java程序员的编程效率,使代码更加简洁、易读和易于维护
管道操作
- filter、map、peek、sorted、distinct、skip、limit、parallel
元素收集
- toList、toSet、toArray、toMap、GroupBy
- anyMatch,allMatch,noneMatch
- count、min、max、average、sum
线程池
核心线程数:当前线程数小于核心线程数,则创建线程执行任务
任务队列:当前线程数大于等于核心线程数,则将任务放入任务队列,等待执行
最大线程数:任务队列已满,当前线程数小于最大线程数,则创建线程执行任务。如果已经达到最大线程数,则拒绝任务并调用饱和策略
最大线程数设置多少合适?
CPU密集型【计算密集型】
最大线程数=CPU核心数+1。另外一个当备份线程
如果线程数远超过CPU核心数,会导致频繁的切换线程从而耗费较多时间
IO密集型
最大线程数=CPU核心数*2
IO操作并不占用CPU,不要让所有CPU闲下来,IO 的速度比起 CPU 是很慢的
Spring
注解
- 类注解:
@Controller
、@Service
、@Repository
、@Component
、@Configuration
- 方法注解:
@Bean
在类注解中有效
1 |
|
SpringBoot
@EnableAsync
启用异步方法执行
在 Spring Boot 应用程序的主类上添加
@EnableAsync
注解它会自动配置一个
TaskExecutor
来处理异步任务的执行,并支持使用@Async
注解来标记异步方法1
2
3
4
5
6
7
8
9
10import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
public class MyService {
// 标记该方法为异步方法
public void doSomething() {
// 执行一些耗时的操作
}
}当调用该方法时,它将在一个单独的线程中执行,并且不会阻塞主线程
需要注意的是,异步方法必须返回
void
或Future
类型的结果
@EnableScheduling
开启定时调度功能
1
2
3
4
5
6
7
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}使用
@Scheduled
注解来声明一个定时任务,例如:1
2
3
4
5
6
7
8
public class MyTask {
//@Scheduled(cron = "0 0 1 * * ?") //每天凌晨1点执行一次
// 每10秒执行一次
public void execute() {
System.out.println("Hello World!");
}
}
@Transactional
- 使用
@Transactional
注解来开启事务。默认发生运行时异常RuntimeException
或错误Error
时会回滚
1 | // 开启事务支持,并在发生异常时回滚事务 |
@EnableTransactionManagement
用于启用事务管理器和事务通知的支持,并配置事务的传播行为、隔离级别等属性。但是,对于大多数应用程序而言,使用默认的事务管理器和传播行为已经足够了
如果你需要自定义事务管理器或更改传播行为等高级配置,则可以添加
@EnableTransactionManagement
注解1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24import org.springframework.context.annotation.Configuration;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.annotation.TransactionManagementConfigurer;
// 启用事务管理
public class TransactionConfig implements TransactionManagementConfigurer {
private final UserService userService;
public TransactionConfig(UserService userService) {
this.userService = userService;
}
public PlatformTransactionManager annotationDrivenTransactionManager() {
return new JpaTransactionManager(); // 返回自定义的事务管理器实例
}
public void configure(TransactionDefinition definition) {
definition.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); // 设置传播行为为 REQUIRED
}
}
@EnableAutoConfiguration 注解有什么用
- @EnableAutoConfiguration 注解是Spring Boot 中的一个核心注解之一,它的作用是开启自动配置
- 将所有符合条件的配置类进行实例化,并把这些 Bean 注入到 Spring 容器中
@ComponentScan 注解有什么用
- @ComponentScan注解是Spring Boot中的一个核心注解之一,它的作用是开启组件扫描
- 自动扫描符合条件的包下的类,进行实例化,并将这些 Bean 注入到 Spring 容器中
- 支持 basePackages 指定基础包路径、excludeFilters 等
@Import
静态注入
1
2动态自动注入:实现
ImportSelector
接口的方法 selectImports 返回要注入类的名称的数组动态手动注入:实现
ImportBeanDefinitionRegistrar
接口的方法 registerBeanDefinitions。支持自定义Bean 的名称
@EnableFeignClients
网络
负载均衡策略
轮询、加权轮询、IP Hash、随机、最小连接
轮询均衡(Round Robin)是每一次来自网络的请求轮流分配给内部中的服务器,从1至N然后重新开始。此种均衡算法适合于服务器组中的所有服务器都有相同的软硬件配置并且平均服务请求相对均衡的情况。
权重轮循均衡(Weighted Round Robin)是根据服务器的不同处理能力,给每个服务器分配不同的权值,使其能够接受相应权值数的服务请求。
IP Hash均衡是根据客户端IP地址进行哈希运算,然后将哈希值与服务器列表大小取模得到一个整数值,用这个整数值来选择对应的服务器。此种均衡算法适合于服务器组中服务器处理能力不均衡的情况。
随机均衡是随机选择一个服务器来处理请求。此种均衡算法适合于服务器组中处理能力不均衡且请求量比较大的情况下使用
最小连接是选择连接数最少的服务器来处理请求
设计模式
《Java-设计模式.md》
- 七大设计原则:单一职责原则、开闭原则、里氏替换原则【使用基类或父类指定子类对象】、依赖倒置原则【面向接口编程】、接口隔离原则【接口尽量单一专用】、迪米特法则【最少知道原则】、组合复用原则【先组合后继承】
- 23种设计模式:单例模、工厂方法、抽象工厂、建造者、原型、观察者、策略、模板、责任链、适配器、代理。代理分为静态代理和动态代理,动态代理就是实现接口 InvocationHandler 的 invoke 方法来实现
缓存
Redis
场景一,一些不太重要的业务数据
示例:前端列表字段比较多时,支持用户自定义设置列显示或隐藏,设置列的显示排序
场景二,频繁变化的数据
示例:用户、车辆等最新轨迹数据,需要快速展示用户或车辆在地图上的最新分布情况。轨迹数据本身是存储到关系型数据库的。当然也可以使用时序数据库实现
场景三,查询接口优化
示例:接口响应慢且数据变更不频繁的情况,可以使用缓存提高响应速度。但注意在数据变更时要让缓存失效。如果数据变更频繁,就不要使用缓存了
业务
业务系统:门户、城管、执法、环卫、园林、市政、应急、车辆、供水、供气、垃圾分类
平台对接:对接第三方平台。例如海康/大华/萤石云视频监控,车辆平台/车联网平台,油烟平台,供热平台,
门户
内容管理:政策法规、新闻动态、行业动态、热点服务、知识平台、成果展示。基于 MySQL+ES 实现数据的存储和检索