1 Star 0 Fork 0

mianshige/java常见面试题

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README

##JAVA常见面试

PDF离线版下载地址

***自我介绍 面试官您好,我叫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

🛠

空文件

简介

java常见面试题 展开 收起
取消

发行版

暂无发行版

贡献者

全部

近期动态

不能加载更多了
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/mianshige/java-Common-test-questions.git
git@gitee.com:mianshige/java-Common-test-questions.git
mianshige
java-Common-test-questions
java常见面试题
master

搜索帮助