Java面试中等测试题
1. 计算机网络传输层有哪些协议?分别适用于什么场景?
答案:
TCP(传输控制协议):适用于需要可靠传输的场景,如文件传输、网页浏览、电子邮件等
UDP(用户数据报协议):适用于实时性要求高、可接受少量丢失的场景,如视频流、语音通话、DNS查询等
2. 多线程的使用场景有哪些?线程开启多少个合适?判断标准有哪些?
答案:
使用场景:高并发请求处理、异步任务执行、大数据处理、定时任务执行等
线程数量:
CPU密集型任务:CPU核心数 + 1
IO密集型任务:2 × CPU核心数
判断标准:CPU利用率、系统响应时间、资源消耗、吞吐量等
3. 线程池的提交方式有哪几种?
答案:
execute(Runnable command):执行无返回值的任务
submit(Callable<T> task):执行有返回值的任务,返回Future对象
submit(Runnable task):执行无返回值任务,返回Future对象
invokeAll/invokeAny:批量执行任务
4. 锁的实现原理介绍一下?
答案:
锁的实现基于AQS(AbstractQueuedSynchronizer)框架,通过CAS(Compare and Swap)操作和队列管理实现:
状态变量:表示锁的占用状态
等待队列:管理等待获取锁的线程
CAS操作:保证原子性的状态变更
5. TCP协议中拥塞控制的主要作用是什么?
答案:
防止网络过载,通过慢启动、拥塞避免、快速重传、快速恢复等机制动态调整发送速率,保证网络稳定性和公平性
6. String类的常用函数有哪些?列举十种
答案:
length(), charAt(), substring(), indexOf(), replace(), split(), trim(), toLowerCase(), equals(), compareTo()
7. String和StringBuffer,StringBuilder的区别有哪些?所有类名包含Buffer的类的内部实现原理是什么?有什么优势?
答案:
区别:
String:不可变,线程安全
StringBuffer:可变,线程安全
StringBuilder:可变,非线程安全
Buffer类原理:基于字符数组实现动态扩容,减少内存分配次数
优势:提高字符串操作性能,减少内存开销
8. String字符串的不可变是指哪里不可变?
答案:
指String对象内部的字符数组(char[] value)被声明为final,一旦创建就不能修改,任何修改操作都会创建新的String对象
9. HTTP协议有哪些字段,列举3个就可以
答案:
Content-Type, User-Agent, Cookie
10. Java异常类有哪些?分别管理什么异常?
答案:
Exception:受检异常,如IOException、SQLException
RuntimeException:非受检异常,如NullPointerException、ArrayIndexOutOfBoundsException
Error:系统错误,如OutOfMemoryError、StackOverflowError
11. Java反射获取类信息的方式有哪几种?分别是什么?
答案:
Class.forName("全限定类名")
对象.getClass()
类名.class
12. Java代理的主要方法有哪几种?列举代理的使用场景2个
答案:
代理方法:
静态代理
动态代理(JDK代理、CGLIB代理)
使用场景:AOP面向切面编程、远程方法调用
13. equals()方法的作用是什么?重写equals需要注意哪些事项?为什么?
答案:
作用:比较两个对象的内容是否相等
注意事项:
必须重写hashCode()方法
保证自反性、对称性、传递性、一致性
非空性:x.equals(null) 返回false
原因:保证对象在集合类中正确工作
14. Java是按值传递还是按引用传递?什么是引用传递,什么是值传递,哪些语言支持引用传递?
答案:
Java是按值传递:
基本类型传递值副本
引用类型传递引用地址的副本
引用传递:直接传递变量地址,如C++的引用参数
值传递:传递变量值的副本
支持引用传递的语言:C++、C#等
15. 描述java的类初始化顺序?如果存在继承,初始化顺序会如何
答案:
初始化顺序:
父类静态变量和静态代码块
子类静态变量和静态代码块
父类实例变量和实例代码块
父类构造方法
子类实例变量和实例代码块
子类构造方法
16. 本地方法栈有什么作用?
答案:
用于执行Native方法(本地方法),为JVM调用本地方法提供内存空间,如调用C/C++编写的函数库
17. 描述Java的双亲委派机制,为什么要用到双亲委派机制
答案:
双亲委派机制:类加载器在加载类时,先委托父加载器尝试加载,只有父加载器无法加载时才自己加载
作用:
避免类重复加载
保证核心类库的安全性
保证类的唯一性
18. 重写和重载的区别是什么?
答案:
重写(Override):子类重新定义父类的方法,方法签名相同
重载(Overload):同一类中方法名相同但参数列表不同
19. 子类构造方法调用父类构造方法的注意事项有哪些?
答案:
必须通过super()调用父类构造方法
super()必须是子类构造方法的第一条语句
如果父类没有无参构造,必须显式调用有参构造
20. 子类实例初始化是否触发父类实例初始化?
答案:
是,创建子类实例时会先初始化父类,包括父类的实例变量、实例代码块和构造方法
21. instanceof关键字的作用是什么?
答案:
用于判断对象是否属于某个类或其子类/实现类,返回boolean值
22. 基本类型的强制类型转换是否会丢失精度?引用类型的强制类型转换需要注意什么?
答案:
基本类型:可能丢失精度,如double转int
引用类型:需要在继承关系内转换,否则抛出ClassCastException
23. 重入锁有哪些?为什么要有重入锁?
答案:
重入锁:ReentrantLock、synchronized
原因:允许线程重复获取已持有的锁,避免死锁,支持锁的重入性
24. 指令重排序的优点是什么?由什么原因导致的?
答案:
优点:提高程序执行性能
原因:编译器优化、处理器乱序执行、内存系统重排序
25. Arrays.sort()的内部原理介绍一下?
答案:
基本类型数组:双轴快速排序(Dual-Pivot Quicksort)
对象数组:TimSort(归并排序+插入排序的优化算法)
26. 堆排序的时间复杂度是多少,空间复杂度是多少?
答案:
时间复杂度:O(n log n)
空间复杂度:O(1)
27. 字符串"asdasjkfkasgfgshaahsfaf"经过哈夫曼编码之后存储比特数是多少?
答案:
需要先统计字符频率,构建哈夫曼树,计算加权路径长度。具体数值需计算后得出。
28. CPU高速缓存的优点和缺点有哪些?
答案:
优点:提高数据访问速度,减少CPU等待时间
缺点:成本高,存在缓存一致性问题,容量有限
29. 线程安全的类有哪些?列举2个以上就可以
答案:
Vector, Hashtable, ConcurrentHashMap, StringBuffer
30. 什么是LRU算法?
答案:
最近最少使用算法,用于缓存淘汰策略,优先淘汰最久未使用的数据
31. 何为Spring Bean容器?Spring Bean容器与Spring IOC容器有什么不同吗?
答案:
Spring Bean容器是Spring框架中用于管理Bean(即Java对象)的容器,负责Bean的创建、配置、组装和管理。Spring IOC(控制反转)容器是Bean容器的具体实现,它通过依赖注入(DI)机制来实现控制反转。实际上,Spring Bean容器和Spring IOC容器是同一个概念,通常互换使用,但IOC容器更强调控制反转的原则。
32. Spring IOC如何理解?
答案:
Spring IOC(控制反转)是一种设计原则,它将对象的创建和依赖关系的管理从应用程序代码中转移到容器中。容器负责实例化、配置和组装Bean,从而降低组件之间的耦合度。IOC通过依赖注入(DI)实现,使得对象不需要直接创建依赖对象,而是由容器注入。
33. Spring DI如何理解?
答案:
Spring DI(依赖注入)是IOC的具体实现方式,指容器在运行时动态地将依赖对象注入到目标对象中。主要有三种注入方式:构造器注入、Setter方法注入和字段注入。DI减少了代码的耦合性,提高了可测试性和可维护性。
34. Spring中基于注解如何配置对象作用域?以及如何配置延迟加载机制?
答案:
作用域配置:使用@Scope注解,例如@Scope("singleton")或@Scope("prototype")
延迟加载:使用@Lazy注解,例如@Lazy(true),表示Bean在第一次被请求时才初始化
35. Spring工厂底层构建Bean对象借助什么机制?当对象不使用了要释放资源,目的是什么?何为内存泄漏?
答案:
构建机制:反射机制(Reflection)
释放资源目的:避免内存泄漏,提高系统资源利用率
内存泄漏:程序中已分配的内存未能正确释放,导致内存浪费,可能引发OutOfMemoryError
36. 描述Spring MVC处理流程及应用优势?
答案:
处理流程:
用户请求 → DispatcherServlet
HandlerMapping查找处理器
调用Controller处理请求
返回ModelAndView
ViewResolver解析视图
渲染视图返回响应
优势:分层清晰、配置灵活、集成便捷、支持RESTful
37. Spring中的事务处理方式及优缺点?
答案:
方式:
编程式事务:代码中显式控制,灵活但繁琐
声明式事务:基于注解或XML配置,简洁但不够灵活
优点:统一管理、减少冗余代码、支持事务传播特性
缺点:声明式事务调试困难,编程式事务代码侵入性强
38. MyBatis应用中#与$有什么异同点?
答案:
#{}:预编译处理,防止SQL注入,会自动添加引号
${}:字符串拼接,有SQL注入风险,直接替换
相同点:都用于参数替换
不同点:安全性和处理方式不同
39. MyBatis应用动态SQL解决了什么问题?
答案:
解决了根据不同条件动态生成SQL语句的问题,避免了在Java代码中拼接SQL字符串的繁琐和安全隐患
40. Shiro框架权限管理时的认证和授权流程描述?
答案:
认证流程:Subject.login() → Realm认证 → 返回AuthenticationInfo
授权流程:权限检查 → Realm授权 → 返回AuthorizationInfo
核心组件:Subject、SecurityManager、Realm
41. BeanFactory和ApplicationContext有什么区别?
答案:
BeanFactory:基础IOC容器,懒加载,功能相对简单
ApplicationContext:继承BeanFactory,提供更多企业级功能,如事件发布、国际化支持,默认立即加载Bean
42. 请解释Spring Bean的生命周期?
答案:
实例化Bean
属性赋值(依赖注入)
调用Aware接口方法
BeanPostProcessor前置处理
初始化方法(@PostConstruct、InitializingBean)
BeanPostProcessor后置处理
Bean使用中
销毁方法(@PreDestroy、DisposableBean)
43. Spring Bean的作用域之间有什么区别?
答案:
singleton:单例,整个容器只有一个实例
prototype:多例,每次请求创建新实例
request:每次HTTP请求创建一个实例
session:每个HTTP会话创建一个实例
globalSession:全局HTTP会话(Portlet应用)
44. 使用Spring框架的好处是什么?
答案:
降低耦合度,提高可维护性
支持AOP编程
声明式事务管理
方便集成其他框架
提高开发效率
45. Spring中用到了那些设计模式?
答案:
工厂模式、单例模式、代理模式、模板方法模式、观察者模式、适配器模式等
46. Spring如何保证Controller并发的安全?
答案:
Controller设计为无状态(stateless)
避免使用实例变量
使用ThreadLocal存储线程相关数据
合理使用同步机制
48. 在Spring中如何注入一个java集合?
答案:
XML配置方式:
xml
<list>、<set>、<map>、<props>
注解方式:使用@Autowired直接注入集合对象
49. Spring支持的事务管理类型?
答案:
编程式事务管理
声明式事务管理(基于XML或注解)
50. Spring框架的事务管理有哪些优点?
答案:
提供一致的事务管理API
支持声明式事务配置
支持多种事务传播行为
与Spring其他模块无缝集成
51. Spring MVC的主要组件?
答案:
DispatcherServlet、HandlerMapping、Controller、ViewResolver、HandlerAdapter、ModelAndView等
52. SpringMvc怎么和AJAX相互调用的?
答案:
使用@ResponseBody注解返回JSON数据
使用@RequestBody注解接收JSON参数
配置消息转换器(如MappingJackson2HttpMessageConverter)
54. mybatis的缓存机制,一级,二级介绍一下?
答案:
一级缓存:SqlSession级别,默认开启,同一会话中有效
二级缓存:Mapper级别,需要手动配置,跨SqlSession有效,可自定义缓存实现
55. SpringMVC与Struts2的区别?
答案:
SpringMVC基于方法拦截,Struts2基于类拦截
SpringMVC与Spring集成更好
SpringMVC性能更高,配置更灵活
Struts2有更丰富的标签库
56. mybatis的基本工作流程?
答案:
加载配置文件
创建SqlSessionFactory
创建SqlSession
执行Mapper接口方法
操作数据库
提交事务
关闭SqlSession
57. 什么是MyBatis的接口绑定,有什么好处?
答案:
接口绑定:将Mapper接口与XML映射文件关联,通过动态代理实现
好处:类型安全、代码简洁、IDE支持更好、便于重构
58. MyBatis的编程步骤?
答案:
定义实体类
创建Mapper接口
编写Mapper XML映射文件
配置MyBatis核心配置文件
通过SqlSessionFactory创建SqlSession
获取Mapper接口实例并调用方法
59. JDBC编程有哪些不足之处,MyBatis是如何解决这些问题的?
答案:
JDBC不足:
代码冗余繁琐
手动管理连接
SQL与Java代码耦合
参数处理麻烦
MyBatis解决方案:自动映射结果集
连接池管理
SQL与代码分离
参数自动绑定
60. MyBatis的优缺点?
答案:
优点:
SQL灵活可控
学习成本低
性能较好
与Spring集成良好
缺点:需要手动编写SQL
数据库移植性差
复杂关联映射配置繁琐
