Java中级面试题记录
Posted IT美男子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java中级面试题记录相关的知识,希望对你有一定的参考价值。
1.Spring Security OAuth2执行流程?
这里是引用
2.Oauth2服务端如何获取token?
这里是引用
3.前端请求是如何到达controller的?
1.用户发送请求至前端控制器DispatcherServlet
2.DispatcherServlet收到请求调用HandlerMapping处理器映射器
3.处理器映射器找到具体的处理器,生成处理器对象并返回给DispatcherServlet
4.DispatcherServlet调用HandlerAdapter处理器适配器
5.HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)
4.Spring如何解决循环依赖问题?
链接: Spring 如何解决循环依赖
5.Spring Bean注入方式有哪些?哪些支持循环依赖?
- 构造器注入
- set方法注入(支持循环依赖)
- 工厂方法注入
6.SpringCloud Alibaba相对于SpringCloud Netflix有哪些优势?为什么要选用SpringCloud Alibaba?
链接: Spring Cloud Alibaba与Spring Cloud Netflix区别
Spring Cloud Alibaba是阿里开源的一套Sping Cloud规范的实现,配置比 NetFlix 更简单易用
7.Nacos的原理?
链接: Nacos 原理
8.Mybatis缓存机制了解吗?谈一谈你的理解?
一级缓存,默认开启(只针对同一个会话,一旦表出现更新操作,则会话失效)
二级缓存是基于namespace级别的缓存
9.Mybatis二级缓存是作用于哪个组件?
基于namespace,也就是我们项目中的xml文件
10.Oracle是mysql升级版,MySQL是Oracle的开源版,那么你为什么选择MySQL,而不是Oracle呢?
- mysql是免费的,oracle是收钱的。
- 对于互联网应用来说,数据库只是作为存储数据的服务来用,因此oracle那样的强大功能用不上,mysql足够
- mysql更加轻便且操作简单、Oracle更加重且操作复杂
11.你这个系统的数据量很大,为什么不考虑使用Hapdoop、Hive、Clickhouse等存储数据,而是选用MySQL呢?
这里是引用
12.你刚刚说你用到MySQL列式存储引擎,那你说一下列式存储引擎它是怎么存储数据的?又是怎么检索数据的?
常用的存储引擎是InnoDB,InnoDB有个聚簇索引,所有数据都是放在聚簇索引的叶子节点上,检索数据时,根据主键就检索到对应的数据
13.MySQL中InnoDB和MyISAM两种存储引擎有什么区别?
14.我们都知道,MySQL存储数据的瓶颈是800万,假设现在有一个MySQL数据库,数据量已经达到千万级,在不改变数据库的情况下,你如何进行性能优化?谈谈你的解决思路?
链接: MySQL千万级数据查询的优化技巧及思路
合理创建索引、进行表分区、优化SQL语句
15.线程池有几个参数?谈谈你的理解?
总共有7个核心参数:
- 核心线程数:核心线程会一直存活
- 最大线程数:线程池能生产的最多的线程数量
- 空闲线程存活时间单位
- 空闲线程存活时间
- 阻塞队列:用于存放多余的任务
- 线程工厂:用于创建线程
- 拒绝策略:当线程达到最大数且队列也满了的时候,对于新的任务的处理方式,共有四种策略(回退主线程、抛出异常、丢弃任务、丢弃队列中第一个任务)
16.线程池提交任务的方式有几种?
17.线程池怎么处理带返回值的任务?
带返回值的任务都是通过Callable+FutureTask的方式来实现,执行Callable接口后,可以获得一个Future的一个对象,通过Feture的get方法就能获得返回的Object数据了。
提示:有返回值的任务必须实现Callable接口,没有返回值的任务实现Runnable接口
18.Lock是如何实现的?
Lock的底层原理时AQS和自旋锁
链接: Lock底层原理
19.AQS中状态值高16位和低16位分别代表什么含义?
高是16位用来表示读锁(共享锁),低16位用来表示写锁(独占锁)
AQS如何用一个Int值来表示读写两种状态
20.你在项目中为什么要选用ElasticSearch?
没用到
21.ElasticSearch的索引你了解吗?请谈一谈?
没用到
22.nginx的root和alias指令有什么作用?
root 和 alias 都可以定义在 location 模块中,都是用来指定请求资源的真实路径
alias 是一个目录别名的定义,root 则是最上层目录的定义。
23.nginx负载均衡的策略有哪些?
nginx负载均衡的5种策略
轮询(默认)、权重、ip_hash、响应时间短优先、url_hash
24.nginx实现会话保持需要使用哪种负载均衡策略?
ip_hash,同一个IP地址的hash值一样,因此就可以会话保持
25.MySQL中InnoDB存储引擎的索引是怎样的数据结构?它是怎么检索数据的?
B+树结构
从根节点开始往下检索、同时也可以从左边的叶子节点开始往后检索
26.索引是不是越多越好?它有什么弊端?
不是,索引过多会占用更多的内存,并且索引越多,维护成本就越高
27.为什么索引会影响更新数据的效率?
因为没次更新数据,都需要去重新构建索引(对索引中的数据更新)
28.什么场景下适合建立索引?
- 频繁作为 WHERE 查询条件的字段
- 经常 GROUP BY 和 ORDER BY 的列
- UPDATE、DELETE 的 WHERE 条件列
- DISTINCT 字段需要创建索引
- 区分度高(散列性高)的列适合作为索引
29.聚簇索引是什么?
聚簇索引只存在Innodb存储引擎中,且每个InnoDB表都有一个聚簇索引 ,聚簇索引使用B+树构建,叶子节点存储的数据是整行记录。一般情况下,聚簇索引等同于主键索引,当一个表没有创建主键索引时,InnoDB会自动创建一个ROWID字段来构建聚簇索引
30.线程池有什么优势?为什么要使用线程池?
便于项目中线程的管理,避免了线程的来回创建于销毁,减轻服务器压力,可以最大程度的重复利用线程
31.线程池的拒绝策略有哪些?
- 退回调用者
- 抛出异常
- 丢弃任务
- 丢弃队列中等待最久的任务
32.谈谈你使用线程池的业务场景?
使用异步的时候都会用到线程池:比如异步生产报告、异步保存最新上报数据等
33.ThreadLocal了解吗?谈谈你的理解?
ThreadLocal 是线程本地存储,在每个线程中都创建了一个 ThreadLocalMap 对象,每个线程可以访问自己内部 ThreadLocalMap 对象内的 value。通过这种方式,避免资源在多线程间共享。
34.谈谈你使用ThreadLocal的业务场景?
ThreadLocal的应用场景
ThreadLocal用在请求头里面存放租户code
35.使用ThreadLocal有哪些要注意的地方?它有哪些坑?
ThreadLocal如果使用不当会造成脏数据、内存泄露等问题
面试官:ThreadLocal的应用场景和注意事项有哪些?
36.什么是线程安全?
线程安全是多线程编程时的计算机程序代码中的一个概念。在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。
37.GC算法有哪些?
38.新生代和老年代有什么区别?
- 新生代占堆内存的三分之一,而老年代占三分之二
- 新生代主要用于存储新创建的对象及对象年龄小于15岁的对象,而老年代主要存储年龄大于15岁以上的对象
- 新生代主要发生的是YGC,而老年代是FGC
- 新生代的GC回收算法为复制算法,老年代一般为标记压缩和标记清除
39.生产环境中运行项目CPU和内存占用过高?你是如何排查的?
40.假设已知生产环境内存占用过高,你如何定位到异常的位置?
根据工作中的实际情况回答
41.kafka是怎么保证高吞吐量的?
42.ribbon的负载均衡策略有哪些?
43.加权重的负载均衡策略有哪些实现方式?
??
44.Mybatis相对于Spring JDBC有什么优势?
1.Mybatis将sql放到了独立的xml文件中,实现了代码和sql的分离,降低了代码的耦合度
2.Mybatis上手更容易,代码更容易维护
3.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集
4.mybatis还给我们提供了很多第三方插件(代码生成器)
45.Spring MVC升级到Spring Boot用到了哪些组件?
46.OpenFeign和RestTemplate有什么区别?
两者是不同的东西,OpenFeign底层是Feign,Feign的底层是Rribbon+RestTemplate,
RestTemplate是Spring提供的用于发送HTTP请求的客户端工具
47.MySQL和PostgreSQL有什么差别?
48.线程池创建有几种方式?
通过JDK的工具类Executors创建 、自己new 一个线程池
49.怎么理解ReentrantLock中的Reentrant?
Reentrant的意思为可重入,顾名思义ReentrantLock是一个可重入锁
50.synchronized和Lock的区别?
- synchronized是关键字,Lock是接口
- synchronized是隐式的加锁,lock是显式的加锁;
- synchronized可以作用于方法上,lock只能作用于方法块
- synchronized底层采用的是objectMonitor,lock底层采用的AQS
- synchronized是阻塞式加锁,lock是非阻塞式加锁支持可中断式加锁,支持超时时间的加锁
- synchronized只支持非公平锁,lock支持非公平锁和公平锁
51.你用到哪些原子类?原子类中的CAS操作中有比较和交换两步操作,它是如何保证线程安全的?
AtomicReference、AtomicLong等 底层通过Unsafe类来实现, 利用了CPU指令保证了操作的原子性
- CAS是JDK提供的非阻塞原子性操作,它通过硬件保证了比较-更新的原子性
CAS
52.有没有了解过底层操作系统如何实现CAS操作?
通过Unsafe类来实现,Unsafe是CAS的核心类,由于Java方法无法直接访问底层系统,而是通过本地(native)方法来访问,Unsafe相当于一个后门。基于该类可以知己操作特定内存的数据。Unsafe类存在于sun.misc(jre文件夹下rt.jar)包中,其内部方法操作可以像C的指针一样直接操作内存,因为java中的CAS操作的执行依赖于Unsafe类的方法
53.有没有用过分布式锁,怎么实现的?
用过,用的是Rediison或者lua脚本
54.Redisson除了分布式锁,你有没有了解过它的一些其它功能?
- Redisson可以用来提供布隆过滤器
- Redisson也可以实现消息队列
- Redisson还可以用于实现延迟队列
55.HttpServlet中Stream是否可以重复读取?
56.Spring和Spring MVC有什么区别?
57.Spring MVC中MVC是什么含义?
58.什么叫面向切面编程?
59.MySQL主从复制模式下,如果出现数据同步异常,你是怎么解决的?
60.遇到过MySQL生产事故吗?请谈一谈?
61.怎样实现一个链表的反转?
先遍历链表,然后将遍历得节点放入栈中,然后再一次从栈中取出来即可
62.谈谈Spring的IOC和AOP?
IOC:控制反转
AOP:面向切面编程
63.SpringBoot中拦截器和过滤器的区别是什么?
过滤器 和 拦截器的 6个区别
1、实现原理不同(过滤器是基于函数回调,拦截器基于Java的反射机制(动态代理))
2、使用范围不同(过滤器Filter只能在WEB中使用,拦截器是一个Spring组件可以单独使用)
3、触发时机不同
- 过滤器Filter是在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完以后
- 拦截器 Interceptor 是在请求进入servlet后,在进入Controller之前进行预处理的,Controller 中渲染了对应的视图之后请求结束。
4、拦截的请求范围不同
- 过滤器几乎可以对所有进入容器的请求起作用
- 拦截器只会对Controller中请求或访问static目录下的资源请求起作用
5、注入Bean情况不同
6、控制执行顺序不同
- 过滤器用@Order注解控制执行顺序,通过@Order控制过滤器的级别,值越小级别越高越先执行
- 拦截器默认的执行顺序,就是它的注册顺序,也可以通过Order手动设置控制,值越小越先执行。
64.前端请求是先到过滤器还是拦截器?
先到达过滤器,在到达拦截器,因为过滤器依托于web容器(tomcat等)在Servlet前,而拦截器在Servlet后
65.怎么控制过滤器和拦截器的执行顺序?
- 过滤器用@Order注解控制执行顺序,通过@Order控制过滤器的级别,值越小级别越高越先执行
- 拦截器默认的执行顺序,就是它的注册顺序,也可以通过Order手动设置控制,值越小越先执行。
66.常用的线程池有哪些?
jdk中Executors工具类创建的3种(固定长度的线程池,单线程的线程池、可扩容的线程池)以及我们自定义的还有spring框架自带的线程池等
67.Spring Bean的作用域有哪些?
单例、多例、reqeust、session、 globalSession
68.你了解有哪些bean的作用域是request?
??
69.为什么spring bean大多数都是单例的,谈谈你的理解?
为了提高性能少创建实例垃圾回收缓存快速获取,因为实例的创建和垃圾的回收都是要消耗性能的
70.spring使用注解注入可以用哪些注解?它们有什么区别?
@Resource:默认按名称注入,名称注入失败后选择按类型注入,时java自带的注解
@Autowired:按类型注入,是spring框架的注解
71.构造注入和注解注入有什么区别?
??
72.java中常用的集合有哪些?
List 和 Set,一般为ArrayList 、LinkedList、 HastSet
73.说一下HashMap的实现原理?
HashMap底层是数组+链表+红黑树构成,往HashMap中添加元素时,首先对key进行hash运算计算出在数组中的下标,然后放到该位置的链表上,如果链表的长度达到一定的阈值时链表则会转换成红黑树
HashMap底层实现原理概述
74.HashMap是否线程安全?线程安全的Map有哪些?
不安全,线程安全的有HashTable、SynchronizedMap、ConcurrentHashMap等
75.线程的创建有哪些方式?
76.Spring中用到哪些设计模式?
单例模式、工厂模式、代理模式、策略模式…
Spring中所使用的设计模式
77.单例模式的实现方式有哪些?
懒汉式、饿汉式、枚举
78.Redis的基本数据类型有哪些?
常用的: 字符串、Hash、列表、无序Set、有序Set
不常用的:BitMap、HyperLogLog、GEO
79.Redis的过期策略有哪些?默认是哪种?
默认策略是:定时删除+惰性删除
80.你擅长哪些技术栈?
集合框架、Spring、业务开发
81.你觉得代码规范有什么意义?
非常的有意义,代码规范不仅可以提高我们的开发效率,还可以便于我们管理项目
82.假如要你做一个难点技术的验证,你将采取怎样的步骤?
参考博客、官网等等先了解该技术点,然后写demo进行验证,如果成功则在运用到项目当中
83.数据库连接池有什么好处?
池化技术都有共同的好处,就是可以最大程度的利用资源,可以进行统一的链接管理,可以有效地控制项目中连接池的最大数等等
84.你使用Nginx解决过什么问题?
曾今用Nginx做过反向代理和负载均衡
85.你对注解是怎么看待的?
注解是种更加优雅的开发方式,但是理解的难度可能稍微要大一些,使用注解可以大大的提高我们的开发效率
86.使用文件服务器MinIO,主要是为了解决什么问题?
没用过,以前用过fastdfs,主要是用于进行项目中图片和各种文件的存储问题等
87.什么是尾递归?
尾递归,顾名思义递归方法的调用放在了方法的尾巴上,调用递归方法是 本次方法已经结束了,栈中对应的栈帧已经消失了,可以有效地避免栈的溢出问题
88.写存储过程和写代码的差别?以及它的优缺点?
没写过存储过程,存储过程是个过时的东西,不推荐使用了
89.你设计库表时会考虑哪些问题?
字段的长度问题、创建的表的字段是否规范、风格是否和项目组统一、后续扩展问题、以及当前表的数据量级问题、后续的优化等
90.你有做过分库分表吗?为什么要做分表?
有过,因为业务数据量太大,因此进行分表操作
91.Linux除了项目的部署,你还会其它的吗?
平时开发的时候会用docker部署需要使用的中间件
92.在使用ElasticSearch时,如果某一个字段类型发生了变化,该怎么处理?
没用过
93.使用ElasticSearch时,如果想用英文或者拼音来检索,该怎么操作?
没用过
94.ElasticSearch是怎样检索数据的?
没用过
95.假设有一个商城订单列表查询的业务场景,现在查询速度较慢,并发量5万左右,你要如何优化才能提高查询速度并且能支撑较高并发量?
视情况而定、优化SQL、加索引、表分区等等
96.你了解哪些设计模式?
单例模式、工厂模式、策略模式、模板模式、代理模式
97.单例模式有哪些优点?
1.由于系统中内存只存在一个对象,因此可以节约系统的的资源,对于一些频繁的创建和销毁的对象单例模式无意可以提供系统的性能;
2.避免对资源的多重占用;
3.提供了对唯一实例的受控访问
98.kafka如何避免重复消费?
99.nacos和eureka有什么区别?
100.spring boot自动装配的过程?
简单来说, Spring Boot 通过 @EnableAutoConfiguration 开启自动装配,通过 SpringFactoriesLoader 最终加载 META-INF/spring.factories 中的自动配置类实现自动装配,自动配置类其实就是通过@Conditional 按需加载的配置类,想要其生效必须引入 spring-boot-starter-xxx 包实现起步依赖
高频面试题:谈谈你对 Spring Boot 自动装配机制的理解
101.spring boot事件监听器有几种实现方式?
- 手动向ApplicationContext中添加监听器
- 将监听器装载入spring容器
- 在application.properties中配置监听器
- 通过@EventListener注解实现事件监听
102.seata有几种模式?
Seata的四种模式介绍
XA、AT、TCC、Seaga
103.如何在不使用临时变量temp的情况下交换两个整数的值?
- 算术运算方法
- 位运算方法(^为异或)
104.垃圾收集器G1和CMS有什么区别?
105.你了解哪些队列和Map是线程安全的?
HashTable、SynchronizedMap
106.Postgre有没有用过空间查询?
107.微服务中网关的主要作用是什么?
进行接口地址的统一,进行动态路由、鉴权、过滤、负载均衡等
108.Ribbon的负载均衡和Nginx的负载均衡有什么区别?
Ribbon的负载均衡一般是指客户端的负载均衡
Nginx的负载均衡值得是服务器端的负载均衡
109.线程之间传递参数的方式有哪些?
- 创建线程时通过构造方法
- 通过set方法
- 通过回调函数
110.ThreadLocal可以在线程之间传递参数吗?
ThreadLocal是用于线程之间进行参数隔离的,因此不可以在线程间传递参数,不过如果是子线程想获取父线程的参数可以使用ThreadLocal的子类InheritableThreadLocal
111.你了解过基于ThreadLocal实现的ITL或TTL吗?
ITL是InheritableThreadLocal,是ThreadLocal的子类,可以用于父子线程之间参数传递,子线程中可以获取父线程的值
TTL是TransmittableThreadLocal,是ITL的子类,ITL虽然解决了父子线程间参数线程传递的问题,但是如果是结合线程池使用还是会存在问题,因此阿里出了一个TTL以解决该问题
提示:ITL是jdk的类,TTL是阿里自己实现的,使用TTL需要导入相关的jar包
112.对于IO密集型和CPU密集型的操作系统,在创建线程池设置参数时有什么区别?
IO密集型:最大线程数=CPU核数 / (1 - 阻塞系数) [ 阻塞系数在0.8 ~ 0.9左右 ]
CPU密集型:最大线程数 = CPU核数 + 1
113.你知道什么是索引覆盖吗?
覆盖索引是select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖
114.如何用SpringMVC做api接口版本控制?
通过 @ApiVersion()注解
如何用SpringMVC做api接口版本控制
115.如何在SpringBoot项目启动后执行某些自定义代码逻辑?
实现CommandLineRunner接口或实现ApplicationRunner接口,并加入到容器中即可
如何在Springboot 项目启动后执行某些自定义代码逻辑
115.@Transactional事务注解在什么场景下会失效?
1、@Transactional 应用在非 public 修饰的方法上
2、@Transactional 注解属性 propagation 设置错误
3、@Transactional 注解属性 rollbackFor 设置错误
4、同一个类中方法调用,导致@Transactional失效
5、异常被你的 catch“吃了”导致@Transactional失效
6、数据库引擎不支持事务
@Transactional注解什么情况会失效?
116.元空间会出现内存溢出吗?如果会,是在什么场景下?
元空间也会溢出,虽然发生的概率很小,但确实也会溢出的,因为元空间主要存储的是类的元数据(class相关信息,包括class对象的Method,Field等),因此如果元空间设置的较小且系统产生的类足够的多的情况下也还是会溢出的。
117.G1垃圾回收器为什么回收效率高?
??
118.线程安全的集合有哪些?
Vector、CopyOnWriteArrayList、SynchronizedList
119.你使用过LinkedList吗?为什么要使用它?
用过,用它进行数据存储、使用Queue时用到了;
Queue q = new LinkedList<>();
以上是关于Java中级面试题记录的主要内容,如果未能解决你的问题,请参考以下文章
分享 2021 年最新阿里 java 面试题:java 初级 + 中级 + 高级面试题(附答案),让你的面试之路畅通无阻!