105 道 Java 面试题,认真思考对你面试很有价值
一、Java 基础
1、什么是面向对象?
2、JDK JRE JVM
3、==和 equals 比较
4、hashCode 与 equals
5、final
6、String、StringBuffer、StringBuilder
7、重载和重写的区别
8、接口和抽象类的区别
9、List 和 Set 的区别
10、ArrayList 和 LinkedList 区别
11、HashMap 和 HashTable 有什么区别?其底层实现是什么?
12、ConcurrentHashMap 原理,jdk7 和 jdk8 版本的区别?
13、什么是字节码?采用字节码的好处是什么?
14、Java 中的异常体系
15、Java 类加载器
16、双亲委托模型
17、GC 如何判断对象可以被回收
选择 Java 基础里的其中一道解答
JDK JRE JVM
JDK:
Java Develpment Kit java 开发工具
JRE:
Java Runtime Environment java 运行时环境
JVM:
java Virtual Machine java 虚拟机
二、线程、并发相关
1、线程的生命周期?线程有几种状态
2、sleep()、wait()、join()、yield()的区别
3、对线程安全的理解
4、Thread、Runable 的区别
5、对守护线程的理解
6、ThreadLocal 的原理和使用场景
7、ThreadLocal 内存泄露原因,如何避免
8、并发、并行、串行的区别
9、并发的三大特性
10、volatile
11、为什么用线程池?解释下线程池参数?
12、简述线程池处理流程
13、线程池中阻塞队列的作用?为什么是先添加列队而不是先创建最大线程?
14、线程池中线程复用原理
选择 Java 线程与并发里的其中一道解答
volatile
(1)保证被 volatile 修饰的共享变量对所有线程总是可见的,也就是当一个线程修改了一个被 volatile 修饰共享变量的值,新值总是可以被其他线程立即得知。
如果线程 2 改变了 stop 的值,线程 1 一定会停止吗?不一定。当线程 2 更改了 stop 变量的值之后,但是还没来得及写入主存当中,线程 2 转去做其他事情了,那么线程 1 由于不知道线程 2 对 stop 变量的更改,因此还会一直循环下去。
(2)禁止指令重排序优化。
write 方法里的 1 和 2 做了重排序,线程 1 先对 flag 赋值为 true,随后执行到线程 2,ret 直接计算出结果,再到线程 1,这时候 a 才赋值为 2,很明显迟了一步。
但是用 volatile 修饰之后就变得不一样了
第一:使用 volatile 关键字会强制将修改的值立即写入主存;
第二:使用 volatile 关键字的话,当线程 2 进行修改时,会导致线程 1 的工作内存中缓存变量 stop 的缓存行无效(反映到硬件层的话,就是 CPU 的 L1 或者 L2 缓存中对应的缓存行无效);
第三:由于线程 1 的工作内存中缓存变量 stop 的缓存行无效,所以线程 1 再次读取变量 stop 的值时会去主 存读取。
inc++; 其实是两个步骤,先加加,然后再赋值。不是原子性操作,所以 volatile 不能保证线程安全。
三、spring
1、如何实现一个 IOC 容器
2、spring 是什么?
3、谈谈你对 AOP 的理解
4、谈谈你对 IOC 的理解
5、BeanFactory 和 ApplicationContext 有什么区别?
6、描述一下 Spring Bean 的生命周期?
7、解释下 Spring 支持的几种 bean 的作用域。
8、Spring 框架中的单例 Bean 是线程安全的么?
9、Spring 框架中都用到了哪些设计模式?
10、Spring 事务的实现方式和原理以及隔离级别?
11、spring 事务传播机制
12、spring 事务什么时候会失效?
13、什么是 bean 的自动装配,有哪些方式?
选择 spring 里的其中一道解答
谈谈你对 AOP 的理解
系统是由许多不同的组件所组成的,每一个组件各负责一块特定功能。除了实现自身核心功能之外,这些组件还经常承担着额外的职责。例如日志、事务管理和安全这样的核心服务经常融入到自身具有核心业务逻辑的组件中去。这些系统服务经常被称为横切关注点,因为它们会跨越系统的多个组件。
当我们需要为分散的对象引入公共行为的时候,OOP 则显得无能为力。也就是说,OOP 允许你定义从 上到下的关系,但并不适合定义从左到右的关系。例如日志功能。
日志代码往往水平地散布在所有对象层次中,而与它所散布到的对象的核心功能毫无关系。
在 OOP 设计中,它导致了大量代码的重复,而不利于各个模块的重用。
AOP:将程序中的交叉业务逻辑(比如安全,日志,事务等),封装成一个切面,然后注入到目标对象(具体业务逻辑)中去。AOP 可以对某个对象或某些对象的功能进行增强,比如对象中的方法进行增强,可以在执行某个方法之前额外的做一些事情,在某个方法执行之后额外的做一些事情
四、springmvc、springBoot、Mybatis
1、Spring Boot、Spring MVC 和 Spring 有什么区别
2、SpringMVC 工作流程
3、Spring MVC 的主要组件?
4、Spring Boot 自动配置原理?
5、如何理解 Spring Boot 中的 Starter
6、什么是嵌入式服务器?为什么要使用嵌入式服务器?
7、mybatis 的优缺点
8、MyBatis 与 Hibernate 有哪些不同?
9、#{}和 ${}的区别是什么?
10、简述 Mybatis 的插件运行原理,如何编写一个插件。
选择 springmvc、springBoot、Mybatis 里的其中一道解答
SpringMVC 工作流程
1)用户发送请求至前端控制器 DispatcherServlet。
2)DispatcherServlet 收到请求调用 HandlerMapping 处理器映射器。
3)处理器映射器找到具体的处理器(可以根据 xml 配置、注解进行查找),生成处理器及处理器拦截器(如果有则生成)一并返回给 DispatcherServlet。
4)DispatcherServlet 调用 HandlerAdapter 处理器适配器。
5)HandlerAdapter 经过适配调用具体的处理器(Controller,也叫后端控制器)
6)Controller 执行完成返回 ModelAndView。
7)HandlerAdapter 将 controller 执行结果 ModelAndView 返回给 DispatcherServlet。8)DispatcherServlet 将 ModelAndView 传给 ViewReslover 视图解析器。
9)ViewReslover 解析后返回具体 View。
10)DispatcherServlet 根据 View 进行渲染视图(即将模型数据填充至视图中)。
11)DispatcherServlet 响应用户。
五、MySQL 和 Redis
1、索引的基本原理
2、mysql 聚簇和非聚簇索引的区别
3、mysql 索引的数据结构,各自优劣
4、索引设计的原则?
5、什么是最左前缀原则?什么是最左匹配原则
6、锁的类型有哪些
7、InnoDB 存储引擎的锁的算法
8、关心过业务系统里面的 sql 耗时吗?统计过慢查询吗?对慢查询都怎么优化过?
9、事务的基本特性和隔离级别
10、ACID 靠什么保证的?
11、什么是 MVCC
12、分表后非 sharding_key 的查询怎么处理,分表后的排序?
13、mysql 主从同步原理
14、简述 MyISAM 和 InnoDB 的区别
15、简述 mysql 中索引类型及对数据库的性能的影响
16、mysql 执行计划怎么看
选择 MySQL 里的其中一道解答
索引的基本原理
索引用来快速地寻找那些具有特定值的记录。如果没有索引,一般来说执行查询时遍历整张表。
索引的原理:就是把无序的数据变成有序的查询
(1) 把创建了索引的列的内容进行排序
(2)对排序结果生成倒排表
(3)在倒排表内容上拼上数据地址链
(4)在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据
六、Redis
1、RDB 和 AOF 机制
2、Redis 的过期键的删除策略
3、Redis 线程模型、单线程快的原因
4、简述 Redis 事务实现
5、redis 集群方案
6、redis 主从复制的核心原理
7、缓存雪崩、缓存穿透、缓存击穿
选择 Redis 里的其中一道解答
Redis 的过期键的删除策略
Redis 是 key-value 数据库,我们可以设置 Redis 中缓存的 key 的过期时间。Redis 的过期策略就是指当 Redis 中缓存的 key 过期了,Redis 如何处理。
惰性过期:只有当访问一个 key 时,才会判断该 key 是否已过期,过期则清除。该策略可以最大化地节省 CPU 资源,却对内存非常不友好。极端情况可能出现大量的过期 key 没有再次被访问,从而不会被清除,占用大量内存。
定期过期:每隔一定的时间,会扫描一定数量的数据库的 expires 字典中一定数量的 key,并清除其中已过期的 key。该策略是一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得 CPU 和内存资源达到最优的平衡效果。
(expires 字典会保存所有设置了过期时间的 key 的过期时间数据,其中,key 是指向键空间中的某个键的 指针,value 是该键的毫秒精度的 UNIX 时间戳表示的过期时间。键空间是指该 Redis 集群中保存的所有键。)
Redis 中同时使用了惰性过期和定期过期两种过期策略。
七、分布式与微服务
1、CAP 理论,BASE 理论
2、负载均衡算法、类型
3、分布式架构下,Session 共享有什么方案
4、简述你对 RPC、RMI 的理解
5、分布式 id 生成方案
6、分布式锁解决方案
7、分布式事务解决方案
8、如何实现接口的幂等性
9、简述 ZAB 协议
10、简述 zk 的命名服务、配置管理、集群管理
11、讲下 Zookeeper watch 机制
12、zk 和 eureka 的区别
13、Spring Cloud 和 Dubbo 的区别
14、什么是 Hystrix?简述实现机制
15、springcloud 核心组件及其作用
16、Dubbo 的整体架构设计及分层
选择分布式与微服务里的其中一道解答
Spring Cloud 和 Dubbo 的区别
底层协议:springcloud 基于 http 协议,dubbo 基于 Tcp 协议,决定了 dubbo 的性能相对会比较好
注册中心:Spring Cloud 使用的 eureka ,dubbo 推荐使用 zookeeper
模型定义:dubbo 将一个接口定义为一个服务,SpringCloud 则是将一个应用定义为一个服务
SpringCloud 是一个生态,而 Dubbo 是 SpringCloud 生态中关于服务调用一种解决方案(服务治理)
八、中间件 MQ
1、简述 RabbitMQ 的架构设计
2、RabbitMQ 如何确保消息发送 ? 消息接收?
3、RabbitMQ 事务消息
4、RabbitMQ 死信队列、延时队列
5、RabbitMQ 镜像队列机制
6、简述 kafka 架构设计
7、kafka 怎么处理消息顺序、重复发送、重复消费、消息丢失
8、Kafka 在什么情况下会出现消息丢失及解决方案?
9、Kafka 是 pull?push?优劣势分析
10、Kafka 中 zk 的作用
11、简述 kafka 的 rebalance 机制
12、Kafka 的性能好在什么地方
选择分布式与微服务里的其中一道解答
简述 kafka 架构设计
Consumer Group:消费者组,消费者组内每个消费者负责消费不同分区的数据,提高消费能力。逻 辑上的一个订阅者。
Topic:可以理解为一个队列,Topic 将消息分类,生产者和消费者面向的是同一个 Topic。
Partition:为了实现扩展性,提高并发能力,一个 Topic 以多个 Partition 的方式分布到多个 Broker 上,每个 Partition 是一个 有序的队列。一个 Topic 的每个 Partition 都有若干个副本(Replica),一个 Leader 和若干个 Follower。生产者发送数据的对象,以及消费者消费数据的对象,都是 Leader。Follower 负责实时从 Leader 中同步数据,保持和 Leader 数据的同步。Leader 发生故障时,某个 Follower 还会成为新的 Leader。
Offset:消费者消费的位置信息,监控数据消费到什么位置,当消费者挂掉再重新恢复的时候,可以从 消费位置继续消费。
Zookeeper:Kafka 集群能够正常工作,需要依赖于 Zookeeper,Zookeeper 帮助 Kafka 存储和管理 集群信息。
这 105 道 Java 面试题的答案已经整理成了 PDF 文档,如下图:——【传送门免费货区】
评论