java面试题整理
原理:基于责任链模式,通过拦截器拦截Executor、StatementHandler、ParameterHandler、ResultSetHandler四大对象的方法。equals()、hashCode()、toString()、clone()、wait()、notify()、finalize()等。Mybatis是一款持久层框架,通过XML或注解配置SQL,灵活映射结果到Java对象,支持动态
1. 谈谈你对SpringMVC的理解?
答案:
SpringMVC是基于Java的轻量级Web框架,采用MVC架构模式。它通过DispatcherServlet统一处理请求,支持注解驱动、数据绑定、视图解析等功能,简化了Web开发。
2. 简述Mybatis的插件运行原理,以及如何编写一个插件?
答案:
-
原理:基于责任链模式,通过拦截器拦截Executor、StatementHandler、ParameterHandler、ResultSetHandler四大对象的方法。
-
编写插件:实现Interceptor接口,重写intercept方法,并使用@Intercepts注解指定拦截的方法。
3. Mybatis是否支持延迟加载?如果支持,它的实现原理是什么?
答案:
-
支持。
-
原理:通过动态代理,在访问关联对象时才触发SQL查询。
4. Mybatis能执行一对一、一对多的关联查询吗?都有哪些实现方式,以及它们之间的区别?
答案:
-
能。
-
方式:嵌套查询(分步查询)、嵌套结果(联表查询)。
-
区别:嵌套查询支持延迟加载,但会引发N+1问题;嵌套结果一次查询全部数据,效率高但不支持延迟加载。
5. Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?
答案:
-
通过ResultMap或自动映射(列名与属性名一致)。
-
映射形式:字段映射、构造器映射、关联映射、集合映射。
6. Mybatis映射文件中,如果A标签通过include引用了B标签的内容,请问,B标签能否定义在A标签的后面,还是说必须定义在A标签的前面?
答案:
-
B标签可以定义在A标签的后面,Mybatis解析时会先完整读取整个文件。
7. MyBatis里面的动态Sql是怎么设定的?用什么语法?
答案:
-
使用XML标签:
<if>、<choose>、<foreach>、<where>、<set>等。 -
语法:OGNL表达式。
8. Mybatis都有哪些Executor执行器?它们之间的区别是什么?
答案:
-
SimpleExecutor、ReuseExecutor、BatchExecutor。
-
区别:SimpleExecutor每次执行新Statement;ReuseExecutor复用Statement;BatchExecutor批量执行。
9. 为什么说Mybatis是半自动ORM映射工具?它与全自动的区别在哪里?
答案:
-
半自动:需要手动编写SQL,灵活可控。
-
全自动(如Hibernate):自动生成SQL,开发效率高但灵活性低。
10. 简单介绍下你对mybatis的理解?
答案:
Mybatis是一款持久层框架,通过XML或注解配置SQL,灵活映射结果到Java对象,支持动态SQL、插件扩展等。
11. 介绍一下Spring的事物管理?
答案:
-
声明式事务(@Transactional)和编程式事务(TransactionTemplate)。
-
支持事务传播行为、隔离级别、回滚规则等。
12. SSM优缺点、使用场景?
答案:
-
优点:轻量、灵活、易于集成。
-
缺点:配置较多,依赖管理复杂。
-
适用场景:中小型企业级应用、需要灵活SQL控制的系统。
13. SpringMVC的工作流程?
答案:
-
用户请求 → DispatcherServlet
-
HandlerMapping 查找Handler
-
HandlerAdapter 执行Controller
-
返回ModelAndView
-
ViewResolver 解析视图
-
渲染视图返回响应
14. 如果你也用过struts2,简单介绍下springMVC和struts2的区别有哪些?
答案:
-
SpringMVC基于方法拦截,Struts2基于类拦截。
-
SpringMVC与Spring集成更好,Struts2配置较繁琐。
-
SpringMVC性能更高,Struts2漏洞较多。
15. 怎么样把数据放入Session里面?
答案:
java
request.getSession().setAttribute("key", value);
16. 讲下SpringMvc的执行流程?
答案:
同第13题。
17. MyBatis(IBatis)的好处是什么?
答案:
-
SQL与代码分离
-
灵活的动态SQL
-
易于优化和调试
18. Bean 工厂和 Application contexts 有什么区别?
答案:
-
BeanFactory:基础容器,懒加载。
-
ApplicationContext:扩展容器,支持AOP、事件、国际化等,预加载Bean。
19. 解释Spring支持的几种bean的作用域?
答案:
-
singleton、prototype、request、session、application、websocket
20. 什么是bean的自动装配?
答案:
Spring自动注入依赖,方式包括:byName、byType、constructor、autodetect。
21. 什么是基于Java的Spring注解配置? 给一些注解的例子?
答案:
-
使用注解代替XML配置。
-
例如:@Component、@Autowired、@Configuration、@Bean
22. 使用Spring通过什么方式访问Hibernate?
答案:
-
通过HibernateTemplate或集成Hibernate的SessionFactory。
23. 如何通过HibernateDaoSupport将Spring和Hibernate结合起来?
答案:
-
继承HibernateDaoSupport,注入SessionFactory,使用getHibernateTemplate()操作数据。
24. Spring框架的事务管理有哪些优点?
答案:
-
统一的事务API
-
声明式事务管理
-
支持多种事务管理器
25. 在Spring AOP 中,连接点和切入点的区别是什么?
答案:
-
连接点:程序中可插入切面的点(如方法调用)。
-
切入点:定义哪些连接点被拦截。
26. AOP作用是什么,底层如何实现在哪些地方会用到,分别简述切面,切入点和通知?
答案:
-
作用:解耦横切逻辑(如日志、事务)。
-
实现:动态代理(JDK/CGLIB)。
-
使用场景:事务管理、日志记录、安全控制。
-
切面:模块化横切关注点;切入点:匹配连接点;通知:切面执行的动作。
27. Spring中AutoWired和Resource之间区别是什么?
答案:
-
@Autowired:按类型注入,属于Spring。
-
@Resource:按名称注入,属于JSR-250。
28. TCP协议有哪些协议字段?如何保障可靠传输的?滑动窗口解决了什么问题?
答案:
-
字段:序号、确认号、窗口大小、标志位等。
-
可靠传输:确认机制、超时重传、流量控制、拥塞控制。
-
滑动窗口:解决流量控制和效率问题。
29. 什么是三次握手,什么是四次挥手。
答案:
-
三次握手:建立连接(SYN、SYN-ACK、ACK)。
-
四次挥手:关闭连接(FIN、ACK、FIN、ACK)。
30. 什么是深拷贝?什么是浅拷贝?
答案:
-
浅拷贝:复制对象本身,不复制内部对象引用。
-
深拷贝:复制对象及其所有引用的对象。
31. 访问器如何保障线程安全?举例说明。
答案:
-
使用synchronized或Lock加锁,或使用原子类。
-
例如:使用AtomicInteger替代int。
32. 抽象类和接口的不同点和相同点有哪些?
答案:
-
相同:都不能实例化,都可定义抽象方法。
-
不同:抽象类可包含实现,单继承;接口可多继承,方法默认public abstract。
33. final关键字能否防止指令重排序?能否代替volatile?
答案:
-
final能保证构造过程中的可见性,但不能完全防止重排序。
-
不能代替volatile,volatile保证可见性和禁止重排序。
34. Static修饰的模块什么时候开始初始化?
答案:
-
类加载时初始化(第一次访问类时)。
35. 什么是对象锁,什么是类锁?
答案:
-
对象锁:锁住对象实例。
-
类锁:锁住类的Class对象。
36. 进程和线程的区别是什么?进程间的通信方式有哪些?线程间的通信方式有哪些?
答案:
-
区别:进程独立资源,线程共享进程资源。
-
进程通信:管道、消息队列、共享内存、Socket。
-
线程通信:共享变量、等待通知机制、Lock/Condition。
37. 类锁和对象锁是否是互斥的?
答案:
-
不互斥,分别锁定不同对象。
38. 什么是注解,注解可以作用类的哪些部分?
答案:
-
注解是元数据,可作用在类、方法、字段、参数、包等。
39. 内部类有哪几种?分别适用于那些场景?
答案:
-
成员内部类、静态内部类、局部内部类、匿名内部类。
-
场景:封装、回调、事件监听等。
40. finally的作用,一般用于什么场景?
答案:
-
无论是否异常都执行,用于资源释放(如关闭流、连接)。
41. 什么是栈溢出?什么是堆溢出?什么是堆外内存?
答案:
-
栈溢出:递归过深或局部变量过多。
-
堆溢出:对象过多,GC无法回收。
-
堆外内存:JVM之外分配的内存(如DirectBuffer)。
42. Java的集合类有哪些?
答案:
-
List:ArrayList、LinkedList
-
Set:HashSet、TreeSet
-
Map:HashMap、TreeMap
-
Queue:LinkedList、PriorityQueue
43. 什么是泛型,请写一个泛型队列或者泛型栈。
答案:
-
泛型:参数化类型,增强类型安全。
java
public class GenericQueue<T> {
private LinkedList<T> list = new LinkedList<>();
public void enqueue(T item) { list.addLast(item); }
public T dequeue() { return list.pollFirst(); }
}
44. 反射能否获取私有信息,如果能,需要注意什么?
答案:
-
能,通过setAccessible(true)取消访问检查。
-
注意:破坏封装性,可能导致安全问题。
45. 线程的状态有哪些?
答案:
-
NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING、TERMINATED
46. 线程.start()是进入什么状态?
答案:
-
RUNNABLE
47. 等待队列和阻塞队列的区别是什么?
答案:
-
等待队列:等待某个条件(如锁)。
-
阻塞队列:队列满/空时阻塞。
48. sleep()和wait()的区别是什么?
答案:
-
sleep不释放锁,wait释放锁。
-
sleep属于Thread,wait属于Object。
49. sleep(1)什么作用,都用于哪些场景?
答案:
-
让当前线程暂停1毫秒,用于短暂释放CPU。
-
场景:模拟延迟、控制执行节奏。
50. 什么是中断机制?举一个中断响应的例子。
答案:
-
中断机制:通过interrupt()通知线程中断。
-
示例:
java
thread.interrupt();
if (Thread.interrupted()) {
// 处理中断
}
51. 守护线程是什么?什么是协程?
答案:
-
守护线程:服务于用户线程,JVM退出时自动结束。
-
协程:轻量级线程,用户态调度,适用于高并发IO。
52. 形成死锁的条件是什么?如何避免死锁?
答案:
-
条件:互斥、请求保持、不可剥夺、循环等待。
-
避免:按顺序加锁、超时机制、死锁检测。
53. 基本类型的数据存在jvm的哪个区域?
答案:
-
局部变量存放在栈帧中,成员变量存放在堆中。
54. 多线程的使用场景有哪些?
答案:
-
并发请求处理、异步任务、定时任务、并行计算。
55. Throw和Throws的区别?
答案:
-
throw:主动抛出异常。
-
throws:声明方法可能抛出的异常。
56. Object类的方法有哪些?分别有什么作用?
答案:
-
equals()、hashCode()、toString()、clone()、wait()、notify()、finalize()等
57. 总线锁的优缺点是什么?
答案:
-
优点:简单,保证原子性。
-
缺点:性能低,阻塞其他CPU访问总线。
58. 写三个线程t1、t2、t3,t1线程只输出A,t2线程只输出B,t3线程只输出C,总体输出顺序控制在ABABC...循环模块"ABABC"
答案:
java
// 使用信号量或锁控制顺序,略
59. 默写懒汉式单例模式,以及代码解释
答案:
java
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
60. 推理题:Tomcat如何访问到Controller的,内部实现原理是什么?不低于500字描述
答案:
Tomcat作为Servlet容器,接收到HTTP请求后,将其交给DispatcherServlet处理。DispatcherServlet通过HandlerMapping找到对应的Controller,再由HandlerAdapter执行Controller方法,最后返回ModelAndView,经ViewResolver渲染后返回响应。整个过程基于Java反射和配置文件/注解映射实现。
更多推荐



所有评论(0)