##JAVA常见面试
***自我介绍 面试官您好,我叫XXX 20xx年本科毕业,现在已经在XXX城市从事Java开发XX年了 之前就职于XXX公司 主要做的项目是XXX系统 目前处于离职状态 本次面试希望取得一份Java开发的职位。
项目介绍 最近再做的是一个XXX系统 ,它主要的作用是XXX 面向的用户是 toC\toB
整个系统包含用户移动端APP 用户自媒体平台 管理平台 和一些支撑系统
1
使用到的技术栈都有 XXX、XXX、XXX (从下面挑或者在你简历的项目描述中挑)
1
在本系统中 我主要负责开发 网站后台的 管理端\前台
负责的系统有
例如 用户移动APP的 内容搜索 频道管理 登录注册 找需求分析和实现思路
XXX模块 其中最重要的功能有XXX功能和XXX功能
XXX模块 其中最重要的功能有XXX功能和XXX功能
开发和线上遇到的问题 其中在负责 XXX模块的时候解决了一个项目难点(架构上的技术难点)
1.凌晨12点的时候缓存大面试失效造成缓存雪崩 组里有一个人把缓存失效的时间改成了凌晨12点 造成系统在凌晨有时候会崩溃这个情况偶尔出现一次很难复现 后来查看和缓存相关的代码发现缓存失效的时间太接近了 我们采用缓存+随机数的方式解决了这个问题 2.项目在上线的时候,CPU使用率飙升 我们通过Java 自带的线程 Dump 工具,导出了出问题的堆栈信息校验URL的代码出现了问题 发现是一个正则表达式引发的
原因是Java正则表达式使用的引擎实现是NFA自动机,这种正则表达式引擎在进行字符匹配时会发生回溯
后面的时候重新修改了这个正则表达式加上下划线和百分号之后,程序就正常了。 用户访问量 1
ArrayList扩容
当调用add方法的时候arraylist容量为10
在扩容的时候会调用grow方法 每次扩容旧容器的1.5倍
HashMap jdk7和jdk8的区别
jdk7 结构: 数组 + 链表
jdk8 结构: 数组 + 链表 + 红黑树
链表节点数 > 8的时候转换为红黑树
jdk7采用的是头插的方式 jdk8采用的是尾插的方式 HashMap初始长度和加载因子 HashMap的初始容量大小默认是16 HashMap的加载因子是0.75 currentHashMap 线程安全、效率高 底层采用的是分段锁机制 segment Spring框架的核心是什么? IOC和AOP 控制反转和面向切面编程 控制反转(IOC):将创建对象的权利交给spring框架,当哪里需要这个对象就在哪里注入这个对象。 面向切面编程(AOP):在不改变原有代码的前提下对一层代码进行加强。 AOP底层原理: 动态代理 动态代理分为 jdk动态代理、cglib动态代理
spring框架优先使用jdk动态代理
如果代理对象有接口,就用 JDK 动态代理
如果代理对象没有接口,那么就直接使用 Cglib 动态代理
AOP使用场景: 日志 Spring对象的生命周期 1.实例化 2.属性复制 3.初始化 4.销毁 SpringMVC框架执行流程 (一定要答出来图中蓝色方框的6个词) img
1.用户发送请求至前端控制器DispatcherServlet 2.DispatcherServlet收到请求调用处理器映射器HandlerMapping。 3.处理器映射器根据请求url找到具体的处理器,生成处理器执行链HandlerExecutionChain(包括处理器对象和处理器拦截器)一并返回给DispatcherServlet。 4.DispatcherServlet根据处理器Handler获取处理器适配器HandlerAdapter执行HandlerAdapter处理一系列的操作,如:参数封装,数据格式转换,数据验证等操作 5.执行处理器Handler(Controller,也叫页面控制器)。 6.Handler执行完成返回ModelAndView 7.HandlerAdapter将Handler执行结果ModelAndView返回到DispatcherServlet 8.DispatcherServlet将ModelAndView传给ViewReslover视图解析器 9.ViewReslover解析后返回具体View 10.DispatcherServlet对View进行渲染视图(即将模型数据model填充至视图中)。 11.DispatcherServlet响应用户。 @SpringBootApplication包含哪几个注解 @SpringBootConfiguration @EnableAutoConfiguration @ComponentScan SpringCloud都用过哪些组件 eureka注册中心 、ribbon和feign远程调用、gateway网关
还用过springcloud Alibaba的组件 nacos注册中心配置中心、sentinel微服务保护 sql优化 主要是避免sql不走索引 避免在字段开头模糊查询 尽量避免使用 in 和 not in 尽量避免进行 null 值的判断 is null 查询条件不能用 != 其次是sql语句的优化 避免出现 select * 多表关联查询时,小表在前,大表在后 合理的分页 limit 提高分页效率 mysql索引类型 1.普通索引 2.唯一索引 3.主键索引 4.组合索引 5.全文索引 mysql索引底层结构 B+树 事务的四大特性 A 原子性 一组不可再分的原子操作 C 一致性 转账前后钱的总数不发生变化 I 隔离性 一个事务的操作不影响另一个事务 D 持久性 事务一旦提交,数据永久更改 Redis的数据类型 (常用的5种,不常用的3种 必背!!!) 常用的:string(字符串),hash(哈希),list(列表),set(集合) zset(sorted set:有序集合)
不常用的:geospatial(适合存储地理位置)、hyperloglog(适合基数统计)、Bitmap(适合存储位图) 缓存击穿、穿透、雪崩 雪崩:某一个时刻出现大规模的缓存失效的情况,大量的请求直接打在数据库上面 击穿:缓存击穿是一个热点的Key,突然间这个Key失效了,导致大并发全部打在数据库上 穿透:缓存key不存在,大量这样的请求查不到缓存,查不到缓存就会去数据库查询 Redis持久化方案 RDB持久化 Redis周期性地创建快照 AOF持久化 以日志的形式记录所有的写入类操作
平时 使用的是两种混合模式 Docker常用命令 docker ps:查看正在运行的docker容器 docker ps -a 查看所有已经创建的容器 docker images 列出镜像列表 docker logs --tail + 数字 输出后xxx行的日志 docker rm 删除容器 RabbitMQ保证消息不丢失 生产者丢失消息:生产者在发送数据之前开启事物,然后发送消息,如果消息没有成功被rabbitmq接收到,那么生产者会受到异常报错,这时就可以回滚事物,然后尝试重新发送;如果收到了消息,那么就可以提交事物
rabbitmq自己弄丢了数据:设置消息持久化到磁盘
消费者弄丢了数据:使用rabbitmq提供的ack机制 RabbitMQ如何保证消息不被重复消费 解决原则:保证消息的唯一性,即使多次传输,也不让消息的多次消费带来影响,也就是保证消息等幂性
具体思路:1、消费者监听到消息后获取id,先去查询这个id是否存中 2、如果不存在,则正常消费消息,并把消息的id存入 数据库或者redis中 3、如果存在则丢弃此消息
RabbitMQ消息积压 1.消费者临时扩容,例如:原先是10个消费者,扩容10倍,100个消费者,目的是加快消息消费速度。 2.修复消费者问题,消费者本身的问题,主要是两个方面: 业务异常和消息处理速度慢。 3.如果消息堆积的太多,短时间内消费不完,可以新开一个队列,让新的消息投递到这个队列,新开一批消费者,处理新的消息,老的队列里面堆积的消息,让一批消费者慢慢跑。 4.如果堆积的消息不重要,直接干掉(删除)队列,创建新的队列,处理新的消息就行,不能在一棵树上吊死。 5.
项目中用过锁吗? 我负责的模块很少用过 但是我用过和线程安全相关的一些工具 比如currentHashMap redis为什么那么快 1.它是基于内存的 2.虽然redis是单线程的,但是底层采用了epoll技术 是一个多路复用的模型 因此它的速度很快 多线程的使用场景 很少 我们系统里面除了监控、报警发邮件之外 很多场景我们都使用的是RabbitMQ 采用什么技术进行服务间调用 feign 底层是通过HTTP协议进行服务间调用的 list、set、map区别 list里面我们常见的有ArrayList、LinkedList ArrayList是基于数组的查询快 增删相对较慢 它是线程不安全的 如果要保证线程安全可以使用Vector、Collections.synchronizedList()或者CopyOnWrite解决
LinkedList是基于链表的查询慢 增删快 它也是线程不安全的 如果要保证线程安全可以使用ConcurrentLinkedQueue
set里面常用的就是hashSet hashSet的特点是无序、不重复 它底层采用的就是hashMap 往hashMap的特点上引(上面写过,往上面找) Kafka和RabbitMQ的区别 rabbitMQ是使用erlang语言进行开发 消息延迟数是微秒级 Kafka主要是在大数据领域用的比较多 他的消息延迟数是毫秒级 但是他的单机吞吐量更高 1
🛠
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。